Jerry's Blog

Recording what I learned everyday

View on GitHub


25 October 2019

LeetCode(48) -- 1005, 1009,

by Jerry Zhang

P1005. Maximize Sum Of Array After K Negations (Easy)

一个整数数组,可以选择其中任何一个数进行变号,可以变号k次(每次都可以选择任何一个数)。问最终得到的数组的和最大是多少。

我的思路

分情况讨论,如果负数的数量多于k,那么就找绝对值最大的k的负数进行变号,如果最后k还有剩余,则说明可能要变正数。如果有0就直接返回了。正数的话,如果k剩下的次数为偶数,那也直接返回了,如果是奇数,则找一个最小的正数进行变号,得到结果。

我的代码

class Solution {
    public int largestSumAfterKNegations(int[] A, int K) {
        Arrays.sort(A);
        int i = 0;
        while (A[i] < 0 && K > 0) {
            A[i] = -A[i];
            i++;
            K--;
        }
        if (A[i] <= 0 || (K & 1) == 0) {
            return sum(A);
        }
        if (i >= 1 && A[i] > A[i - 1]) {
            A[i - 1] = -A[i - 1];
        } else {
            A[i] = -A[i];
        }
        return sum(A);
    }

    private int sum (int[] A) {
        int sum = 0;
        for (int i : A) {
            sum += i;
        }
        return sum;
    }
}

88%

最优解

class Solution {
    public int largestSumAfterKNegations(int[] A, int K) {
        for(int i=0; i<K; i++){
            modifiyArray(A);
        }
        int sum = 0;
        for(int i=0; i<A.length; i++){
            sum += A[i];
        }
        return sum;
    }

    public void modifiyArray(int[] A){
        int minIndex = 0;
        int min = Integer.MAX_VALUE;

        for(int i=0; i < A.length; i++){
            if(A[i] < min){
                minIndex = i;
                min = A[i];
            }
        }

        A[minIndex] = A[minIndex] * -1;
    }
}

其实不用排序,每次都去改最小值,一定是最优的结果。不过这样做理论上的时间复杂度其实是高于排序的

P1009. Complement of Base 10 Integer (Easy)

整数的二进制表示,取反(0变1,1变0),找到那个新的整数。

我的思路

有多少位,就弄多少个1,最后跟原数做异或运算,就是结果。

我的代码

class Solution {
    public int bitwiseComplement(int N) {
        int temp = N >> 1;
        int ones = 1;
        while (temp != 0) {
            ones = (ones << 1) + 1;
            temp = (temp >> 1);
        }
        return N ^ ones;
    }
}

100%

最优解

class Solution {
    public int bitwiseComplement(int N) {
        int X = 1;
        while (N > X) X = X * 2 + 1;
        return X - N;
    }
}

P1010. Pairs of Songs With Total Durations Divisible by 60 (Easy)

在一个数组中,找出有多少两个数的和能被60整除的pair

我的思路

一开始暴力求解,超时了。然后用hashmap,也很慢,但过了。

我的代码

class Solution {
    public int numPairsDivisibleBy60(int[] time) {
        int count = 0;
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < time.length; i++) {
            Integer value = map.getOrDefault((60 - time[i] % 60) % 60, 0);
            count += value;
            map.put(time[i] % 60, map.getOrDefault(time[i] % 60, 0) + 1);
        }
        return count;
    }
}

38%

最优解

class Solution {
    public int numPairsDivisibleBy60(int[] time) {
        int[] arr = new int[501];

        for (int i : time)
            arr[i]++;

        for (int i = 60; i <= 500; i++)
            arr[i % 60] += arr[i];

        int result = ((arr[0] - 1) * arr[0] + (arr[30] - 1) * arr[30]) / 2;

        for (int i = 1; i < 30; i++)
            result += arr[i] * arr[60 - i];

        return result;
    }
}

time[i]是小于500的,这点很重要。

tags: LeetCode