쿼리 후 짝수 합계  


난이도 쉽게
자주 묻는 질문 과연
알고리즘 배열 코딩 인터뷰 인터뷰 준비 리트코드 LeetCodeSolutions

문제 정책  

이 문제에서 우리는 정렬 정수 및 배열 배열 검색어. 다음 i 번째 두 개의 매개 변수가 있습니다. 색인 발. 각 쿼리 후에 배열 [인덱스]에. 우리는 모두의 합을 찾아야합니다 조차 각 쿼리 후 배열의 정수를 반환하고 정수 벡터로 반환합니다.

A = [1,2,3,4], queries = [[1,0],[-3,1],[-4,0],[2,3]]
8 6 2 4
A = [1,2,3,4], queries = [[2,0],[-2,2],[6,0],[4,2]]
6 6 6 6

접근  

쿼리 후 짝수 합계 구현

한 가지 기본 접근 방식은 다음과 같습니다.

각 쿼리에 대해 해당 요소를 업데이트 한 다음 전체 배열을 순회하여 모든 짝수의 합을 찾습니다. 그러나이 접근 방식은 각 쿼리에 대해 O (N) 시간이 걸리며 전체 시간은 O (N * Q)로 이어집니다.

우리는 유지함으로써 더 잘 할 수 있습니다 사전 합계 이것은 배열에있는 모든 짝수의 합입니다. 각 쿼리에 대해 해당 인덱스의 요소가 짝수 합계 (A [index] % 2 == 0인지 확인하여). 그렇다면 누적 합계에서 빼고 A [index]를 A [index] + val로 업데이트합니다. 그런 다음 A [index]가 짝수인지 다시 확인해야합니다. 그렇다면 다음 항목에 추가합니다. 짝수_합. 다른 모든 짝수 요소는 영향을받지 않기 때문에이 쿼리에 대한 답이 될 것입니다. 따라서 우리는 O (1) 시간에 각 쿼리에 응답합니다.

참조
실행 길이로 인코딩 된 목록 Leetcode 솔루션의 압축 해제

C ++ 프로그램

#include <bits/stdc++.h>

using namespace std;

vector<int> sumEvenAfterQueries(vector<int>& A, vector<vector<int>>& queries) {
    int evenSum = 0;

    for(int &x : A) {
        if(x % 2 == 0) {
            evenSum += x;
        }
    }

    int n = queries.size() , val , idx;
    vector <int> ans(n);
    for(int i = 0 ; i < n ; i++) {
        val = queries[i][0] , idx = queries[i][1];
        if(A[idx] % 2 == 0) evenSum -= A[idx];
        A[idx] += val;
        if(A[idx] % 2 == 0) evenSum += A[idx];
        ans[i] = evenSum;
    }

    return ans;
}

int main() {
    vector <int> A = {1 , 2 , 3 , 4};
    vector < vector <int> > queries = {{1 , 0} , {-3 , 1} , {-4 , 0} , {2 , 3}};
    vector <int> ans = sumEvenAfterQueries(A , queries);
    for(int &x : ans)
        cout << x << " ";
    cout << endl;
    return 0;
}

자바 프로그램

class sum_even_after_queries {
    public static void main(String args[]) {
        int[] A = {1 , 2 , 3 , 4};
        int[][] queries = {{1 , 0} , {-3 , 1} , {-4 , 0} , {2 , 3}};
        int[] ans = sumEvenAfterQueries(A , queries);
        for(int x : ans)
            System.out.print(x + " ");
        System.out.println();
    }

    public static int[] sumEvenAfterQueries(int[] A, int[][] queries) {
        int evenSum = 0;

        for(int x : A) {
            if(x % 2 == 0) {
                evenSum += x;
            }
        }
        int n = queries.length , val , idx;
        int[] ans = new int[n];
        for(int i = 0 ; i < n ; i++) {
            val = queries[i][0];
            idx = queries[i][1];

            if(A[idx] % 2 == 0) evenSum -= A[idx];
            A[idx] += val;
            if(A[idx] % 2 == 0) evenSum += A[idx];
            ans[i] = evenSum;
        }

        return ans;
    }
}
8 6 2 4

쿼리 후 짝수 합계의 복잡성 분석

시간 복잡성

O (N + Q), 여기서 N = 주어진 배열의 크기. Q = 쿼리 수. 우리는 O (N) 시간을 투자하여 짝수 합계 각 질의에 응답하는 O (Q) 시간.

공간 복잡성 

O (1), 우리는 일정한 메모리 공간을 사용합니다.