1477. 找两个和为目标值且不重叠的子数组 给你一个整数数组 arr 和一个整数值 target 。 请你在 arr 中找 两个互不重叠的子数组 且它们的和都等于 target 。可能会有多种方案

  1. 找两个和为目标值且不重叠的子数组
    给你一个整数数组 arr 和一个整数值 target 。

请你在 arr 中找 两个互不重叠的子数组 且它们的和都等于 target 。可能会有多种方案,请你返回满足要求的两个子数组长度和的 最小值 。

请返回满足要求的最小长度和,如果无法找到这样的两个子数组,请返回 -1 。

我是废物

class Solution {
public:
    int minSumOfLengths(vector<int>& arr, int target) {
        unordered_map<int, int> fuck;   // 记录前缀和出现的最后一个下标
        int t = 0;
        int ans = 2e9;
        vector<int> m_f;   // 记录到每个位置,和为target的最短子数组的长度
        int mi = 0;    
        fuck[0]  = -1;
        for(int i = 0; i < arr.size(); i ++){
            t += arr[i];
            fuck[t] = i;
            // cout << i << " ";
            if(fuck.count(t - target)){
                int l_i = fuck[t - target];
                int ttt = i - l_i;
                if(! mi) mi = ttt;
                else mi = min(mi, ttt);
                m_f.push_back(mi);
                if(l_i != -1 && m_f[l_i] != 0) ans = min(ans, m_f[l_i] + ttt);
            }else{
                m_f.push_back(mi);
            }
        }
        if(ans == 2e9) return -1;
        else return ans;

    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对您的问题,我可以回答如下: 编写一个整数组,求出该数组的最大值、最小值、平均值以及所有数组元素的和。 假设给定的整数数组arr,那么可以通过以下方式计算出数组的最大值、最小值、平均值和所有元素的和: 1. 最大值:通过遍历数组,依次比较每个元素与当前最大值的大小,如果当前元素大于当前最大值,则更新最大值。代码示例: int max = arr[0]; for(int i=1; i<arr.length; i++){ if(arr[i] > max){ max = arr[i]; } } 2. 最小值:同理,通过遍历数组,依次比较每个元素与当前最小值的大小,如果当前元素小于当前最小值,则更新最小值。代码示例: int min = arr[0]; for(int i=1; i<arr.length; i++){ if(arr[i] < min){ min = arr[i]; } } 3. 平均值:可以先计算出所有元素的和,然后除以数组的长度即可。代码示例: int sum = 0; for(int i=0; i<arr.length; i++){ sum += arr[i]; } double avg = (double)sum / arr.length; 4. 所有元素的和:可以通过遍历数组,将所有元素累加起来即可。代码示例: int sum = 0; for(int i=0; i<arr.length; i++){ sum += arr[i]; } 综上所述,可以得到以下完整的代码实现: int[] arr = {1, 2, 3, 4, 5}; int max = arr[0]; int min = arr[0]; int sum = 0; for(int i=0; i<arr.length; i++){ if(arr[i] > max){ max = arr[i]; } if(arr[i] < min){ min = arr[i]; } sum += arr[i]; } double avg = (double)sum / arr.length; System.out.println("数组的最大值为:" + max); System.out.println("数组的最小值为:" + min); System.out.println("数组的平均值为:" + avg); System.out.println("数组的所有元素的和为:" + sum);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值