209.长度最小的子数组
题目描述
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
示例:
输入:s = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。
题目链接
思路分析
-
暴力:
两个for循环,第一个for记录每一个数组位置,第二for 往后寻找,找到满足≥ s的条件,不断比较大小。 -
滑动窗口:
双指针滑动,双指针,[left,right]满足条件后,left右移动,right继续遍历,窗口往前滑动
代码
- 暴力
略 - 窗口滑动
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left = 0;
//int 最大值
int result = Integer.MAX_VALUE;
int sum = 0;
for(int right = 0;right < nums.length;right++){
sum += nums[right];
while(sum >= target){
result = Math.min(result,right - left + 1);
//窗口左指针右移,移除前一个元素
sum -= nums[left++];
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}
904. 水果成篮
题目描述
思路分析
类似双指针的窗口滑动,难点在于存储每棵树窗口的大小不是单纯和数组下标有关,而是数组的值有关(也就是果树的种类),考虑一一映射关系(key - value)的关系可以使用HashMap。
代码
class Solution {
public int totalFruit(int[] fruits) {
Counters counter = new Counters();
int left = 0;
int result = 0;
for(int right = 0;right < fruits.length;right++){
counter.add(fruits[right],1);
while(counter.size() >= 3){
counter.add(fruits[left],-1);
if(counter.get(fruits[left]) == 0){
counter.remove(fruits[left]);
}
left++;
}
result = Math.max(result,right - left + 1);
}
return result;
}
}
class Counters extends HashMap<Integer,Integer>{
public int get(int k){
return containsKey(k) ? super.get(k) : 0;
}
public void add(int k,int v){
put(k, v + get(k));
}
}
59. 螺旋矩阵 II
题目表述
思路分析
循环不变得量,换句话说就是在本题中每一行,每一列得赋值规则要一样,比如[ , )
转几圈得问题:矩阵中对角线得位置是看成每圈开始得位置,就有对角线个数/2,也就是n/2,但是要考虑奇偶性
代码
class Solution {
public int[][] generateMatrix(int n) {
int loop = 0;//控制循环圈数 同时控制偏移循环不变量
int start = 0;//每一层圈的初始位置
int i,j;
int[][] nums = new int[n][n];
int count = 1;//记录元素赋值
while(loop++ < n/2){
for(j = start;j < n - loop;j++){
nums[start][j] = count++;
}
for(i = start;i < n - loop;i++){
nums[i][j] = count++;
}
for(;j > start;j--){
nums[i][j] = count++;
}
for(;i > start;i--){
nums[i][j] = count++;
}
start++;
}
if(n % 2 ==1){
nums[start][start] = count;
}
return nums;
}
}