DAY2-滑动窗口

重点:

  • 注意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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值