重点:
- 注意leetcode209滑动窗口的写法和思考,且滑动窗口有基本统一的格式。
- 如果有需要可以遍历hash或者数组实现检查滑动窗口的元素。
- leetcode59更加清楚的写法是用一个总的坐标(x,y)每次基于上次的坐标做判断。
LeetCode209.长度最小的子数组
/**
* 滑动窗口
* @param target
* @param nums
* @return
*/
public static int minSubArrayLen1(int target, int[] nums) {
int k=1000000,p=0,q=0,sum=0;
//滑动窗口问题用两个while循环比较好操作
while (q < nums.length) {
sum += nums[q];
while (sum >= target) {
//为什么每次大于时就要求一个值
k = Math.min(k, q - p + 1);
sum -= nums[p];
p++;
}
//end++放在最后,实现了先虚假的+一下
q++;
}
//如果不符合则返回0
if(k==1000000) {
return 0;
}
return k;
}
LeetCode940.水果成篮
/**
* 用map来放水果
* @param fruits
* @return
*/
public int totalFruit(int[] fruits) {
// 定义两个指针当作滑动窗口
int s = 0, e = 0, k = 0;
Map<Integer, Integer> cnt = new HashMap<Integer, Integer>();
while (e < fruits.length) {
// 更新hash表的值,如果一开始可能没有值的话可以用getordefault函数
cnt.put(fruits[e], cnt.getOrDefault(fruits[e], 0) + 1);
// 当超过两个2种水果时,s前进
while (cnt.size() > 2) {
// 更新hash表的值
cnt.put(fruits[s], cnt.get(fruits[s]) - 1);
if (cnt.get(fruits[s]) == 0) {
cnt.remove(fruits[s]);
}
s++;
if (s >= fruits.length) {
break;
}
}
e++;
// 更新k的值
k = Math.max(k, e - s);
}
return k;
}
LeetCode76.最小覆盖字串
//映射box
private static int[] sbox = new int[26];
private static int[] tbox = new int[26];
/**
* 最小覆盖字串
* @param s
* @param t
* @return
*/
public static String minWindow(String s, String t) {
//遍历t
for(int i=0;i<t.length();i++) {
if(t.charAt(i)>='a'&&t.charAt(i)<='z') {
tbox[t.charAt(i)-'a']++;
}else if(t.charAt(i)>='A'&&t.charAt(i)<='Z') {
tbox[t.charAt(i)-'A']++;
}
}
//打印t
for(int i=0;i<26;i++) {
System.out.print(tbox[i]+" ");
}
System.out.println();
//遍历s
int left=0;
int r=1000000,rl=0,rr=0;
for(int i=0;i<s.length();i++) {
if(s.charAt(i)>='a'&&s.charAt(i)<='z') {
sbox[s.charAt(i)-'a']++;
}else if(s.charAt(i)>='A'&&s.charAt(i)<='Z') {
sbox[s.charAt(i)-'A']++;
}
//打印s
System.out.print("i:"+i+" ");
for(int k=0;k<26;k++) {
System.out.print(sbox[k]+" ");
}
System.out.println();
while(cheak()) {
System.out.println("i:"+i+" "+"left:"+left+" "+"r: "+r);
//记录最小字串
if((i-left+1)<r) {
r=(i-left+1);
rr=i;
rl=left;
}
if(s.charAt(left)>='a'&&s.charAt(left)<='z') {
sbox[s.charAt(left)-'a']--;
}else if(s.charAt(left)>='A'&&s.charAt(left)<='Z') {
sbox[s.charAt(left)-'A']--;
}
left++;
}
}
for(int k=0;k<26;k++) {
System.out.print(sbox[k]+" ");
}
System.out.println();
if(r==1000000) {
return "";
}
return s.substring(rl, rr+1);
}
/**
* 检查函数
* @return
*/
public static boolean cheak() {
for(int i=0;i<26;i++) {
if(sbox[i]<tbox[i]) {
return false;
}
}
return true;
}
LeetCode59.螺旋矩阵II
public static int[][] generateMatrix(int n) {
//构建矩阵
int[][] matrix= new int[n][n];
//填充矩阵
int k=1,offset=0,loops=1;
//定义目前的位置
int i=0,j=0;
while(loops<=n/2) {
//上边-》尤其注意当运行到左边的时候会导致i--,所以每次需要重新定点offset
for(j=offset;j<n-offset-1;j++) {
matrix[offset][j]=k;
k++;
}
//右边
for(i=offset;i<n-offset-1;i++) {
matrix[i][j]=k;
k++;
}
//下边
for(;j>offset;j--) {
matrix[i][j]=k;
k++;
}
//左边
for(;i>offset;i--) {
matrix[i][j]=k;
k++;
}
offset++;
loops++;
}
//如果是奇数则还需再填一个数
if(n % 2 == 1) {
matrix[offset][offset]=k;
}
return matrix;
}