LeetCode——和等於 k 的最長子數組長度


Q:給定一個數組 nums 和一個目標值 k,找到和等於 k 的最長子數組長度。如果不存在任意一個符合要求的子數組,則返回 0。
注意:
 nums 數組的總和是一定在 32 位有符號整數范圍之內的。

示例 1:
輸入: nums = [1, -1, 5, -2, 3], k = 3
輸出: 4
解釋: 子數組 [1, -1, 5, -2] 和等於 3,且長度最長。
示例 2:
輸入: nums = [-2, -1, 2, 1], k = 1
輸出: 2
解釋: 子數組 [-1, 2] 和等於 1,且長度最長。

進階:
你能使時間復雜度在 O(n) 內完成此題嗎?

A:

  1. 我覺得我有毛病,我竟然第一時間用遞歸……不過就算用了memo,也超時了
    private int len = 0;
    private Set<String> set;

    public int maxSubArrayLen(int[] nums, int k) {
        if (nums.length == 0)
            return 0;
        set = new HashSet<>();
        sum(nums, k, 0, 0, nums[0]);
        return len;
    }

    private void sum(int[] nums, int k, int left, int right, int count) {
        String s = left + "+" + right;
        if (set.contains(s) || right < left)
            return;
        set.add(s);
        if (count == k) {
            len = Math.max(len, right - left + 1);
        }
        sum(nums, k, left + 1, right, count - nums[left]);
        if (right + 1 < nums.length)
            sum(nums, k, left, right + 1, count + nums[right + 1]);
    }
  1. 前綴和+map
    計算出每個索引的前綴和,利用HashMap儲存每個前綴和和對應的索引,如果出現前綴和相同的情況,則儲存較小的索引(因為要求最長子數組);利用一個指針i作為子數組的結尾從后向前遍歷(從前往后要判斷索引位置在當前位置的前還是后,從后往前無需判斷,因為如果在后為負),尋找map中是否儲存有key為sum[i] - k的索引,如果有則更新max。當指針的值小於等於max的值后,則無需再繼續遍歷
    public int maxSubArrayLen(int[] nums, int k) {
        if (nums.length == 0)
            return 0;
        int maxLen = 0;
        int[] sums = new int[nums.length + 1];
        sums[0] = 0;
        Map<Integer, Integer> map = new HashMap<>();
        map.put(0, 0);
        for (int i = 1; i <= nums.length; i++) {
            sums[i] = sums[i - 1] + nums[i - 1];
            if (!map.containsKey(sums[i]))
                map.put(sums[i], i);
        }
        for (int i = sums.length - 1; i > maxLen; i--) {
            if (map.containsKey(sums[i] - k)) {
                maxLen = Math.max(maxLen, i - map.get(sums[i] - k));
            }
        }
        return maxLen;
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM