1. 2차원 접두사합 알고리즘

접두사 및 템플릿

1차원 접두사 합계:

import java.util.*;

public class Main {
    
    
    public static void main(String[] args) {
    
    
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt(),q = scan.nextInt();
        int[] arr = new int[n + 1];
        long[] dp = new long[n + 1];
        for(int i = 1;i <= n;i++) {
    
    
            arr[i] = scan.nextInt();
            dp[i] = dp[i - 1] + arr[i];
        }
        while(q > 0) {
    
    
            int l = scan.nextInt(),r = scan.nextInt();
            System.out.println(dp[r] - dp[l - 1]);
            q--;
        }
    }
}

2차원 접두사 합계:

import java.util.*;

public class Main {
    
    
    public static void main(String[] args) {
    
    
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt(),m = scan.nextInt(),q = scan.nextInt();
        int[][] arr = new int[n + 1][m + 1];
        long[][] dp = new long[n + 1][m + 1];
        for(int i = 1;i <= n;i++) {
    
    
            for(int j = 1;j <= m;j++) {
    
    
                arr[i][j] = scan.nextInt();
                dp[i][j] = arr[i][j] + dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1];
            }
        }
        while(q > 0) {
    
    
            int x1 = scan.nextInt(),y1 = scan.nextInt();
            int x2 = scan.nextInt(),y2 = scan.nextInt();
            System.out.println(dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1]);
            q--;
        }
    }
}

724. 배열의 중심 인덱스 찾기

정수 배열 nums가 주어지면 배열의 중심 인덱스를 계산하십시오 .

배열 중앙 첨자는 배열의 첨자이며 왼쪽에 있는 모든 요소의 합은 오른쪽에 있는 모든 요소의 합과 같습니다.

가운데 첨자가 배열의 가장 왼쪽 끝에 있으면 첨자 왼쪽에 요소가 없기 때문에 왼쪽에 있는 숫자의 합은 0으로 간주됩니다. 이것은 배열의 맨 오른쪽에 있는 가운데 첨자에도 적용됩니다.

배열에 가운데 첨자가 여러 개 있는 경우 왼쪽에 가장 가까운 첨자를 반환해야 합니다. 배열에 중앙 첨자가 없으면 -1을 반환합니다.
여기에 이미지 설명 삽입

class Solution {
    
    
    public int pivotIndex(int[] nums) {
    
    
        int n = nums.length;
        int[] f = new int[n];
        int[] g = new int[n];

        for(int i = 1;i < n;i ++) {
    
    
            f[i] = f[i - 1] + nums[i - 1];
        }
        for(int j = n - 2;j >= 0;j--) {
    
    
            g[j] = g[j + 1] + nums[j + 1];
        }
        for(int i = 0;i < n;i++) {
    
    
            if(f[i] == g[i]) {
    
    
                return i;
            }
        }
        return -1;
    }
}

238. 자신이 아닌 배열의 곱

정수 배열 nums가 주어지면 배열 답을 반환합니다. 여기서 answer[i]는 nums[i]를 제외한 nums의 모든 요소의 곱과 같습니다.

제목 데이터는 배열 nums에 있는 모든 요소의 모든 접두사 요소와 접미사의 곱이 32비트 정수 범위 내에 있음을 보장합니다.

나누기를 사용하지 말고 이 문제를 O(n) 시간 복잡성으로 해결하십시오.
여기에 이미지 설명 삽입

class Solution {
    
    
    public int[] productExceptSelf(int[] nums) {
    
    
        int n = nums.length;
        int[] f = new int[n];
        int[] g = new int[n];
        f[0] = 1;
        g[n - 1] = 1;
        for(int i = 1;i < n;i++) {
    
    
            f[i] = f[i - 1] * nums[i - 1];
        }
        for(int i = n - 2;i >= 0;i--) {
    
    
            g[i] = g[i + 1] * nums[i + 1];
        }
        int[] ret = new int[n];
        for(int i = 0;i < n;i++) {
    
    
            ret[i] = f[i] * g[i];
        }
        return ret;
    }
}

560. K의 하위 배열 합계

정수 배열 nums와 정수 k가 주어지면 이 배열에서 합계가 k인 연속 하위 배열의 수를 세고 반환하십시오.
여기에 이미지 설명 삽입

class Solution {
    
    
    public int subarraySum(int[] nums, int k) {
    
    
        Map<Integer,Integer> hash = new HashMap<>();
        hash.put(0,1);
        int sum = 0, ret = 0;
        for(int x : nums) {
    
    
            sum += x;
            ret += hash.getOrDefault(sum - k,0);
            hash.put(sum,hash.getOrDefault(sum,0) + 1);
        }
        return ret;
    }
}

974. K로 나누어지는 하위 배열 합계

정수 배열 nums 및 정수 k 가 주어지면 합계가 k로 나누어지는 (연속적이고 비어 있지 않은) 하위 배열의 수를 반환합니다.

하위 배열은 배열의 연속 부분입니다.
여기에 이미지 설명 삽입

class Solution {
    
    
    public int subarraysDivByK(int[] nums, int k) {
    
    
        Map<Integer,Integer> hash = new HashMap<>();
        hash.put(0,1);
        int sum = 0,ret = 0;
        for(int x : nums) {
    
    
            sum += x;
            int r = (sum % k + k) % k;
            ret += hash.getOrDefault(r,0);
            hash.put(r,hash.getOrDefault(r,0) + 1);
        }
        return ret;
    }
}

525. 연속 배열

이진 배열 nums가 주어지면 동일한 수의 0과 1을 포함하는 가장 긴 연속 하위 배열을 찾고 하위 배열의 길이를 반환합니다.
여기에 이미지 설명 삽입

class Solution {
    
    
    public int findMaxLength(int[] nums) {
    
    
        Map<Integer,Integer> hash = new HashMap<>();
        hash.put(0,-1); //默认存在一个前缀和为0的情况

        int sum = 0,ret = 0;
        for(int i = 0; i < nums.length;i++) {
    
    
            sum += (nums[i] == 0 ? -1 : 1);
            if(hash.containsKey(sum)) {
    
    
                ret = Math.max(ret,i - hash.get(sum));
            } else {
    
    
                hash.put(sum,i);
            }
        }
        return ret;
    }
}

1314. 매트릭스 영역 및

mxn 행렬 mat와 정수 k가 주어지면 각 answer[i][j]가 다음 조건을 만족하는 모든 요소 mat[r][c]의 합인 행렬 답을 반환하십시오.

i - k <= r <= i + k, j - k <= c <= j + k 및 ​​(r, c)는 행렬에 있습니다.
여기에 이미지 설명 삽입

class Solution {
    
    
    public int[][] matrixBlockSum(int[][] mat, int k) {
    
    
        int m = mat.length,n = mat[0].length;

        int[][] dp = new int[m + 1][n + 1];
        for(int i = 1;i <= m;i++) {
    
    
            for(int j = 1;j <= n;j++) {
    
    
                dp[i][j] = mat[i - 1][j - 1] + dp[i - 1][j] + dp[i][j - 1] 
                - dp[i - 1][j - 1];
            }
        }
        int[][] ret = new int[m][n];
        for(int i = 0;i < m;i++) {
    
    
            for(int j = 0;j < n;j++) {
    
    
                int x1 = Math.max(0,i - k) + 1;
                int y1 = Math.max(0,j - k) + 1;
                int x2 = Math.min(m - 1,i + k) + 1;
                int y2 = Math.min(n - 1,j + k) + 1;
                ret[i][j] = dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1-1][y1-1];
            }
        }
        return ret;
    }
}

Supongo que te gusta

Origin blog.csdn.net/buhuisuanfa/article/details/131843864
Recomendado
Clasificación