当前位置:网站首页>LeetCode 1477. Find two subarrays with sum as the target value and no overlap

LeetCode 1477. Find two subarrays with sum as the target value and no overlap

2022-07-07 16:59:00 @Little safflower

Problem description

Give you an array of integers  arr And an integer value  target .

Please come in arr  In looking for Two non overlapping subarrays   And their sum is equal to  target . There may be many options , Please return the sum of the length of the two sub arrays that meet the requirements minimum value .

Please return the minimum length and , If you can't find such two sub arrays , Please return -1 .

Example 1:

Input :arr = [3,2,2,4,3], target = 3
Output :2
explain : There are only two subarrays and 3 ([3] and [3]). Their length and are 2 .
Example 2:

Input :arr = [7,3,4,7], target = 7
Output :2
explain : Even though we have 3 The sum of two non overlapping subarrays is 7 ([7], [3,4] and [7]), But we will choose the first and third sub arrays , Because of their length and 2 Is the minimum .
Example 3:

Input :arr = [4,3,2,6,2,3,4], target = 6
Output :-1
explain : We have only one sum for 6 Subarray .
Example 4:

Input :arr = [5,5,4,4,5], target = 3
Output :-1
explain : We can't find and for 3 Subarray .
Example 5:

Input :arr = [3,1,1,1,5,1,2,1], target = 3
Output :3
explain : Notice the subarray [1,2] and [2,1] Can't be a solution because they overlap .
 

Tips :

1 <= arr.length <= 10^5
1 <= arr[i] <= 1000
1 <= target <= 10^8

source : Power button (LeetCode)
link :https://leetcode.cn/problems/find-two-non-overlapping-sub-arrays-each-with-target-sum
Copyright belongs to the network . For commercial reprint, please contact the official authority , Non-commercial reprint please indicate the source .

Java

class Solution {
    public int minSumOfLengths(int[] arr, int target) {
        int n = arr.length;
        int[] dp = new int[n];
        // Minimum requirements , Fill with a larger number 
        Arrays.fill(dp,Integer.MAX_VALUE / 2);
        int ans = Integer.MAX_VALUE;
        // Double pointer 
        int left = 0;
        int sum = 0;
        for(int right = 0;right < n;right++){
            sum += arr[right];
            while(left <= right && sum > target){
                sum -= arr[left++];
            }
            if(sum == target){
                dp[right] = right - left + 1;
                if(left != 0){
                    ans = Math.min(ans,dp[left - 1] + dp[right]);
                }
            }
            if(right != 0){
                dp[right] = Math.min(dp[right - 1],dp[right]);
            }
        }
        return ans > n ? -1 : ans;
    }
}

 

原网站

版权声明
本文为[@Little safflower]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/188/202207071512070643.html