intsearch(vector<int>& nums, int target){ int left = 0; int right = nums.size() - 1; while (right >= left) { int middle = left + ((right - left)>>1); //left每一次加上新的中间值 if (nums[middle]>target){ right = middle - 1; } elseif (nums[middle]<target){ left = middle + 1; } elsereturn middle; } return-1; }
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 采用二分法,注意停止条件,当left>right就停止了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
classSolution { public: intmySqrt(int x){ int left = 0; int right = x; while (right>=left) { int middle = left + ((right-left)>>1); double p = 1.0*middle*middle; if (p==x) return middle; if (p<x){ left = middle+1; } else right = middle-1; } return right; } };
intminSubArrayLen(int target, vector<int>& nums){ int x = INT32_MAX; int i = 0; int subLength = 0; int sum = 0; for (int j = 0;j<nums.size();j++){ sum+=nums[j]; while (sum>=target){ subLength = j - i + 1; x = x > subLength ? subLength : x; sum-=nums[i++]; } } return x == INT32_MAX? 0 : x; }
滑动窗口例题2 The maximum sum subarray problem consists in finding the maximum sum of a contiguous subsequence in an array or list of integers:
maxSequence({-2, 1, -3, 4, -1, 2, 1, -5, 4}); //should be 6: {4, -1, 2, 1} Easy case is when the list is made up of only positive numbers and the maximum sum is the sum of the whole array. If the list is made up of only negative numbers, return 0 instead.
Empty list is considered to have zero greatest sum. Note that the empty list or array is also a valid sublist/subarray.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#include<vector> #include<algorithm>
intmaxSequence(const std::vector<int>& arr){ int left = 0, sum = 0, maxSum = 0; // 初始化最大和为 0(符合题目要求) for (int right = 0; right < arr.size(); ++right) { sum += arr[right]; // 扩展窗口 maxSum = std::max(maxSum, sum); // 更新最大子数组和 // 如果当前窗口的和变成负数,移动左指针 while (sum < 0) { sum -= arr[left++]; } }