普通版 剑指 Offer 浅刷浅刷(19)

<= i - k) {indexQueue.pop_front();}myVector.push_back(nums[indexQueue.front()]);}}return myVector;}};
方法一:
方法二:这是一个双端队列 。
剑指 Offer 59 - II. 队列的最大值
class MaxQueue {private:queue myQueue;deque maxDeque;public:MaxQueue() {}int max_value() {if (myQueue.empty()) {return -1;}return maxDeque.front();}void push_back(int value) {myQueue.push(value);while (!maxDeque.empty() && value > maxDeque.back()) {maxDeque.pop_back();}maxDeque.push_back(value);}int pop_front() {if (myQueue.empty()) {return -1;}int temp = myQueue.front();myQueue.pop();if (maxDeque.front() == temp) {maxDeque.pop_front();}return temp;}};/*** Your MaxQueue object will be instantiated and called as such:* MaxQueue* obj = new MaxQueue();* int param_1 = obj->max_value();* obj->push_back(value);* int param_3 = obj->pop_front();*/
这个题实际上和上边的滑动窗口是同一个类型的题,我们用一个双端队列存储它的最大值,在push的时候,遇到value比其最后一个值大,就把最后一个数pop掉(因为这个滑动窗口中原来的最后一个值没有新的value大,而且如果pop的话一定是原来的值先pop出去,就说明原来的值现在在存储最大值的双端队列中存在的意义不大了),存入新的value 。
剑指 Offer 60. n个骰子的点数
class Solution {public:vector dicesProbability(int n) {vector dp(6, 1.0 / 6.0);for (int i = 2; i <= n; i++) {vector tempDp(5 * i + 1, 0); //这里的 5 * i + 1 是因为n个骰子,值范围为[n, 6n],总数量就为 5 * n + 1for (int j = 0; j < dp.size(); j++) {for (int k = 0; k < 6; k++) {tempDp[j + k] += dp[j] / 6.0;}}dp = tempDp;}return dp;}};
第n个骰子的结果有5n+1种,其递推公式为:
将其代码化就行 。
剑指 Offer 61. 扑克牌中的顺子
class Solution {public:bool isStraight(vector& nums) {int zeroNum = 0;sort(nums.begin(), nums.end());for (int i = 0; i < nums.size() - 1; i++) {if (!nums[i]) { //计算癞子zeroNum++;continue;}if (nums[i] == nums[i + 1]) { //除0外相邻它就不可能是顺子return 0;} else { //计算相邻两数之间应该补几个癞子(即0)zeroNum -= nums[i + 1] - nums[i] - 1;}}return zeroNum >= 0 ? 1 : 0; //剩余癞子数大于等于零,他就是顺子}};
看上边说的就行 。
剑指 Offer 62. 圆圈中最后剩下的数字
class Solution {private:int fun(int n, int m) {if (n == 1) {return 0;}int x = fun(n - 1, m);return (m + x) % n;}public:int lastRemaining(int n, int m) {return fun(n, m);}};
我就只能想到模拟法了,还得看k神的,动态规划,吊太,每一次要删除的就是上次删除的位置加上m,避免大于n,最后还会%n,f(n) = (f(n - 1) + t) % n 。
剑指 Offer 63. 股票的最大利润
class Solution {public:int maxProfit(vector& prices) {if (prices.size() == 0 || prices.size() == 1) {return 0;}int money = 0, min = 0;for (int i = 1; i < prices.size(); i++) {if (prices[i] < prices[min]) {min = i;continue;}if (prices[i] - prices[min] > money) {money = prices[i] - prices[min];}}return money;}};
定义一个变量money用来存储最大的利益,再定义一个标识min,用来指向之前的最小数,每次都进行相减运算,比money大就表示利润高,就记录下来,如果遇到比指点min还小的,也记录下来,重复上述操作,直到数组遍历完 。
剑指 Offer 64. 求1+2+…+n
//方法一:class Solution {public:int sumNums(int n) {int sum = n;n && (sum += sumNums(n - 1));return sum;}};//方法二:class Solution {public:int sumNums(int n) {bool a[n][n + 1];return sizeof(a) >> 1;}};//方法三:class Solution {public:int sumNums(int n) {int ans = 0, A = n, B = n + 1;(B & 1) && (ans += A);A