当前位置: 首页 > 编程笔记 >

C ++中最小K总和最短的子数组

松鸣
2023-03-14
本文向大家介绍C ++中最小K总和最短的子数组,包括了C ++中最小K总和最短的子数组的使用技巧和注意事项,需要的朋友参考一下

假设我们有一个数组A。我们必须找到A的最短,非空,连续子数组的长度,其总和至少为K。如果没有这样的子数组,则返回-1。

因此,如果输入类似于[5,3,-2,2,1]且k = 6,则输出将为2,如我们所见(5 + 3)> = 6

为了解决这个问题,我们将遵循以下步骤-

  • n:= A的大小

  • ans:= n + 1,j:= 0,和:= 0

  • 定义一个双端队列dq

  • 对于初始化i:= 0,当i <n时,更新(将i增加1),执行-

    • 从dq中删除最后一个元素

    • ans:= ans和i-dq的第一个元素的最小值

    • 从dq中删除前元素

    • ans:= ans和i + 1的最小值

    • A [i]:= A [i] + A [i-1]

    • 如果i> 0,则-

    • 如果A [i]> = K,则-

    • 而(不是dq为空且A [i]-第一元素A [dq]> = K),则执行-

    • 而(不dq为空,并且A [i] <= A [dq]的最后一个元素,则执行-

    • 在dq的末尾插入i

    • 返回(如果ans与n + 1相同,则为-1,否则为ans)

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
       public:
       int shortestSubarray(vector<int> &A, int K) {
          int n = A.size();
          int ans = n + 1;
          int j = 0;
          int sum = 0;
          deque<int> dq;
          for (int i = 0; i < n; i++) {
             if (i > 0)
             A[i] += A[i - 1];
             if (A[i] >= K) {
                ans = min(ans, i + 1);
             }
             while (!dq.empty() && A[i] - A[dq.front()] >= K) {
                ans = min(ans, i - dq.front());
                dq.pop_front();
             }
             while (!dq.empty() && A[i] <= A[dq.back()])
             dq.pop_back();
             dq.push_back(i);
          }
          return ans == n + 1 ? -1 : ans;
       }
    };
    main(){
       Solution ob;
       vector<int> v = {5,3,-2,2,1};
       cout << (ob.shortestSubarray(v, 6));
    }

    输入值

    {5,3,-2,2,1}, 6

    输出结果

    2
     类似资料:
    • 我需要找到总和大于或等于< code>k的最小子阵列长度。数组将只有正数。 例如 输入:< code>target = 7,< code>nums = [2,3,1,2,4,3]输出:2说明:子数组[4,3]在问题约束下长度最小。 在我的代码中,对于输入:< code>target = 7,< code>nums = [2,3,1,2,4,3]我得到的答案是< code>3,但正确答案是< cod

    • 给定一个大小为n的非递减数组a和一个整数k,如何找到数组a的一个子序列S,其元素的最大可能和,使得这个和最多为k。如果有多个这样的子序列,我们只想找到一个。 例如,让数组为{1,2,2,4},n=4,k=7。那么,答案应该是{1,2,4}。 蛮力方法大约需要O(n(2^n-1))但是有更有效的解决方案吗?

    • 子数组包含正数和负数。你必须找到一个最大和子数组,使子数组的长度大于或等于k。 下面是我用C++编写的使用Kadane算法的代码。 我的代码工作得很好,但很慢,我想不出任何方法来改进我的代码。我也读过这个问题,找到最长的子数组,它的和可以被K整除,但这不是我想要的,长度也可以大于K。

    • NowCoder 解题思路 快速选择 复杂度:O(N) + O(1) 只有当允许修改数组元素时才可以使用 快速排序的 partition() 方法,会返回一个整数 j 使得 a[l..j-1] 小于等于 a[j],且 a[j+1..h] 大于等于 a[j],此时 a[j] 就是数组的第 j 大元素。可以利用这个特性找出数组的第 K 个元素,这种找第 K 个元素的算法称为快速选择算法。 // jav

    • 我想找到给定正整数数组中元素的最大数目,使得它们的和小于或等于给定的k。例如,我有一个数组 答案是3,因为1,2,3是求和6的最大元素。

    • 一、题目 输入n个整数,找出其中最小的k个数。 例子说明: 例如输入4 、5 、1、6、2、7、3 、8 这8 个数字,则最小的4 个数字是1 、2、3 、4 二、解题思路 解法一:O(n)时间算法,只有可以修改输入数组时可用。 可以基于Partition函数来解决这个问题。如果基于数组的第k个数字来调整,使得比第k个数字小的所有数字都位于数组的左边,比第k个数字大的所有数字都位于数组的右边。这样