Skip to content

普通数组


53. 最大子数组和

java
// 动态规划,前缀和如果没有变为负,就继续使用,否则更新为0,确保子数组以非负数开始计数
class Solution {
    public int maxSubArray(int[] nums) {
        int ans = 0x80000000, sum = 0;
        for(int num : nums){
            sum += num;
            ans = Math.max(ans, sum);
            sum = Math.max(sum, 0);
        }

        return ans;
    }
}

//官解也不错:
class Solution {
    public int maxSubArray(int[] nums) {
        int pre = 0, maxAns = nums[0];
        for (int x : nums) {
            pre = Math.max(pre + x, x);
            maxAns = Math.max(maxAns, pre);
        }
        return maxAns;
    }
}

56. 合并区间

java
public class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> a[0] - b[0]); // 左端点排序
        List<int[]> ans = new ArrayList<>();
        for (int[] cur : intervals) {
            int n = ans.size();
            if (n > 0 && cur[0] <= ans.get(n - 1)[1]) {
                ans.get(n - 1)[1] = Math.max(ans.get(n - 1)[1], cur[1]);  // <= 即可合并
            } else {
                ans.add(cur);                         // 无法合并
            }
        }
        return ans.toArray(new int[ans.size()][]); // list转为数组
    }
}

189. 轮转数组

java
// 记住翻转数组的方法,---->-->翻转<--<----,然后分别翻转两段-->---->;一定记得k要取余
// 环状替换的方法需要计算最大公约数
class Solution {
    public void rotate(int[] nums, int k) {
        k %= nums.length;
        reverse(nums, 0, nums.length);
        reverse(nums, 0, k);
        reverse(nums, k, nums.length);
    }

    public void reverse(int[] nums, int start, int end) {
        int temp;
        for (int i = start, j = end - 1; i < j; i++, j--) {
            temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
        }
    }
}

238. 除自身以外数组的乘积

java
// 左边前缀积,右边前缀积
class Solution {
    public int[] productExceptSelf(int[] nums) {
        int[] ans = new int[nums.length];
        for (int i = 0, cur = 1; i < nums.length; i++) {
            ans[i] = cur;
            cur *= nums[i];
        }
        for (int i = nums.length - 1, cur = 1; i >= 0; i--) {
            ans[i] *= cur;
            cur *= nums[i];
        }

        return ans;
    }
}