day02 数组part02

209.长度最小的子数组

滑动窗口, 窗口满足条件,就开始移左边。

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int length = Integer.MAX_VALUE;
        int sum = 0;
        int left = 0;
        for (int i = 0; i < nums.length; i++){
            sum += nums[i];
            // 窗口中的sum满足大于等于target,进行处理
            while(sum >= target){
                // 记录长度
                length = Math.min(length, i - left + 1);
                // 缩小窗口,左边界右移
                sum -= nums[left];
                left++;
            }
        }
        return length == Integer.MAX_VALUE ? 0 : length;
    }
}

59.螺旋矩阵II

模拟数值填充过程

注意点:
1. 上下左右转的时候,保持数量恒定,占第一个,但不占最后一个

2.offset设置,举例理解offset需要loop多少次

3.奇数情况下,需要补充中间的值

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] matrix = new int[n][n];
        int index = 1;
        int offset = 0;
        while(offset <= n / 2){
            // 需要保持四个边界遍历长度一致
            // 上
            for(int i = offset; i < n - offset - 1; i++){
                matrix[offset][i] = index++;
            }
            // 右
            for(int i = offset ; i < n - offset - 1; i++){
                matrix[i][n- offset - 1] = index++;
            }
            // 下
            for(int i = n - offset - 1; i > offset; i--){
                matrix[n - offset - 1][i] = index++;
            }
            // 左
            for(int i = n - offset - 1; i> offset; i--){
                matrix[i][offset] = index++;
            }
            offset++;
        }
        if (n % 2 == 1){
            matrix[n/2][n/2] = index;
        }
        return matrix;
    }
}

58区间和

前缀和

class Solution58 {

    public int rangeSum(int n, int[] nums, int start, int end){
        int[] dp =new int[n];
        dp[0] = nums[0];
        for(int i = 1; i < n; i++){
            dp[i] = dp[i-1] + nums[i];
        }
        if (start == 0){
            return dp[end];
        }else{
            return dp[end] - dp[start - 1];
        }
    }


    public static void main(String[] args){
        int n = 5;
        int[] nums = {1,2,3,4,5};
        Solution58 solution = new Solution58();
        System.out.println("0,1范围内的区间和: " + solution.rangeSum(n, nums, 0, 1));
        System.out.println("1,3范围内的区间和: " + solution.rangeSum(n, nums, 1, 3));
    }
    
}

​​​​​​​

44开发商购买土地

横竖分割成2块,看两块差值的最小值。

剪枝操作,如果正好达到总值的一半,说明可以分割成大小一样的区块,直接返回0.

class Solution44 {
    public int minDifference(int[][] grid) {
        int total = 0;
        int n = grid.length;
        int m = grid[0].length;
        for (int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                total += grid[i][j];
            }
        }
        int diff = Integer.MAX_VALUE;
        // 竖切, index最大取m-2
        int index = 0;
        int left = 0;
        while(index < m - 1){
            // 加index这一列
            for(int i = 0; i < n; i++){
                left+= grid[i][index];
            }
            if (left == total - left){
                return 0;
            }
            diff = Math.min(diff, Math.abs(total - 2 * left));
            index++;
        }
        // 横切 index 最大取n-2
        int top = 0;
        index = 0;
        while(index < n - 1){
            for(int j = 0; j < m; j++){
                top += grid[index][j];
            }
            if (top == total - top){
                return 0;
            }
            diff = Math.min(diff, Math.abs(total - 2 * top));
            index++;
        }
        return diff;
    }

    public static void main(String[] args){

        String grid = "[[1,2,3],[2,1,3],[1,2,3]]";
        int[][] matrix = parseStringTo2DArray(grid);
        Solution44 solution = new Solution44();
        int result = solution.minDifference(matrix);
        System.out.println("最小差距为: " + result);
    }

    private static int[][] parseStringTo2DArray(String str){
        // "[[1,2,3],[2,1,3],[1,2,3]]"    ->    ["1,2,3" ,"2,1,3", "1,2,3"]
          String[] rowStr = str.substring(2, str.length() - 2).split("\\],\\[");
          int[][] grid = new int[rowStr.length][];
          for(int i = 0; i < rowStr.length; i++){
            //  "1,2,3"   -> ["1", "2", "3"]   
            String[] nums = rowStr[i].split(",");
            grid[i] = new int[nums.length];
            for(int j =0; j < nums.length; j++){
                grid[i][j] = Integer.parseInt(nums[j].trim());
            }
          }
          return grid;
    }
       

    
}

你可能感兴趣的:(算法,java,数据结构)