总结一哈
209. 长度最小的子数组
滑动窗口;
右指针一直移动;
当sum >= target时;
左指针向右移动一格;
for(int i = right; i < nums.length; i++) {
sum += nums[i];
while(sum >= target) {//attention是while循环不是if判断
ans = Math.min(ans, i - left + 1);
sum -= nums[left++];
}
}
169. 多数元素
我一个HashMap啊,猝不及防;
162. 寻找峰值
1、找最大值;
2、int left = 0, right = nums.length - 1;
while(left < right) {
int mid = left + (right - left) / 2;
if(nums[mid] < nums[mid + 1]) left = mid + 1;
else right = mid;
}
return left;
如果nums[mid] < nums[mid + 1],证明峰值在右, 则left = mid + 1;
否则,证明峰值在左right = mid;
154. 寻找旋转排序数组中的最小值 & 153. 寻找旋转排序数组中的最小值 II
int left = 0;
int right = nums.length - 1;
while(left < right) {
int min = (right - left) / 2 + left;
if(nums[min] < nums[right]) right = min;
else if(nums[min] > nums[right]) left = min + 1;
}
return nums[left];
&
int left = 0;
int right = nums.length - 1;
while(left < right) {
int mid = left + (right - left) / 2;
if(nums[mid] > nums[right]) left = mid + 1;
else if(nums[mid] < nums[right]) right = mid;
else right--;//神来之笔
}
return nums[left];


若中间值小于最右,则右边直接舍去:right = min;
否(中间值大于最右)则:左边直接舍去;
152. 乘积最大子数组
因为遍历是按顺序的,存在正负数交叠的情况;
而且题目要求子数组;
难点在于负数的随机出现,导致答案突变;
所以,本体的一个秒的解法是:同时求最大和最小,当遇到负数的时候,提前交换二者之值;
int ans = nums[0];
int iMax = 1;
int iMin = 1;
for(int i = 0; i < nums.length; i++) {
if(nums[i] < 0) {//提前交换
int t = iMax;
iMax = iMin;
iMin = t;
}
iMax = Math.max(iMax * nums[i], nums[i]);//动态规划
iMin = Math.min(iMin * nums[i], nums[i]);
ans = Math.max(ans, iMax);
}
128. 最长连续序列
Arrays.sort(nums);
if(nums.length == 0) return 0;
int ans = 1, cur = 1;
for(int i = 1; i < nums.length; i++) {
if(nums[i] == nums[i - 1]) continue;
if(nums[i] == nums[i - 1] + 1) {
cur++;
ans = Math.max(ans, cur);
}else {//都不满足,直接重置,开始新的求解
cur = 1;
}
}
122. 买卖股票的最佳时机 II
int ans = 0;
for(int i = 1; i < prices.length; i++) {
ans += Math.max(0, prices[i] - prices[i - 1]);
}
甭管选哪天;
只要两天之间能赚,直接加上;
浙公网安备 33010602011771号