首页 > 其他分享 >统计得分小于K的子数组数目

统计得分小于K的子数组数目

时间:2023-05-24 19:45:31浏览次数:35  
标签:得分 right nums sum long 数组 数目 left

一个数组的分数定义为数组之和乘以数组的长度

1. 前缀和 + 二分

class Solution {
public:
    long long countSubarrays(vector<int>& nums, long long k) {
        //注意是正整数数组
        int n = nums.size();
        long long res = 0;
        vector<long long> presum(n+1);
        for(int i=0;i<n;i++)
            presum[i+1] = presum[i] + nums[i];
        for(int i=0;i<n;i++){
            int left = i; int right = n;
            while(left<right){
                int mid = (left+right+1)/2;
                long long cur = presum[mid]-presum[i];//当前区间和
                if(cur*(mid-i)>=k)  right = mid-1;
                else left = mid;
            }
            res+=(left-i);
        }
        return res;
    }
};

2. 双指针

由于都是正数,所以可以贪心的移动右指针

class Solution {
public:
    long long countSubarrays(vector<int> &nums, long long k) {
        long ans = 0L, sum = 0L;
        for (int left = 0, right = 0; right < nums.size(); ++right) {
            sum += nums[right]; //累计当前区间和
            while (sum * (right - left + 1) >= k)//移动左指针至满足条件
                sum -= nums[left++];//移动后扣除前面的
            ans += right - left + 1;//计数
        }
        return ans;
    }
};

标签:得分,right,nums,sum,long,数组,数目,left
From: https://www.cnblogs.com/929code/p/17429311.html

相关文章

  • 【算法学习前置】了解JS中的数组
    介绍此篇属于前端算法入门系列的第一篇,主要介绍常用的数组方法、字符串方法、遍历方法、高阶函数、正则表达式以及相关数学知识。文章主要包含以下内容:数组常用方法字符串常用方法常用遍历方法&高阶函数常用正则表达式数学知识一、数组常用方法push()在尾部追加,类似......
  • 剑指 Offer 56 - I. 数组中数字出现的次数
    题目描述:一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。  设 nums=[3,3,4,4,1] ,以上计算流程如下图所示。 本题难点: 数组 nums 有 两个 只出现一次的数字,因此无法通......
  • 【剑指offer】- 数组中重复的数字 -48/67
    1.题目描述在一个长度为n的数组nums里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例1:输入:[2,3,1,0,2,5,3]输出:2或32.题目分析此题考查的是面试者的沟通能力,......
  • 数据转换-整数字节数组
    在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务1参考《GMT0009-2012SM2密码算法使用规范》第6节“数据转换”在utils.h和utils.c中完成整数与8位字节串的转换功能(10'):intInt2ByteArr(unsignedinti,unsignedchar*ba);intByteArr2Int(unsignedchar*......
  • 不同路径 II(数组、动态规划)、同构字符串(哈希表、字符串)、颠倒二进制位(位运算、分
    不同路径II(数组、动态规划)一个机器人位于一个_mxn_网格的左上角(起始点在下图中标记为“Start”)。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网......
  • 数据转换-整数字节数组
    在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务1参考《GMT0009-2012SM2密码算法使用规范》第6节“数据转换”在utils.h和utils.c中完成整数与8位字节串的转换功能(10'):intInt2ByteArr(unsignedinti,unsignedchar*ba);intByteArr2Int(unsignedchar*ba......
  • uniapp 数组添加不重复元素
    if(this.checkTimes.includes(_item.time)){this.checkTimes=this.checkTimes.filter((item)=>{returnitem!=_item.time;});}else{this.ch......
  • 数据转换-位串字节数组
    在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务1参考《GMT0009-2012SM2密码算法使用规范》第6节“数据转换”在附件中的utils.h和utils.c中完成位串与8位字节串的转换功能(10'):intBitstr2ByteArr(unsignedchar*bs,unsignedchar*ba,int*lba);intByteA......
  • 蓝桥杯2022年第十三届决赛真题-斐波那契数组(动态规划)
    题目描述如果数组A=(a0,a1,···,an−1)满足以下条件,就说它是一个斐波那契数组:n≥2;a0=a1;对于所有的i(i≥2),都满足ai=ai−1+ai−2。现在,给出一个数组A,你可以执行任意次修改,每次修改将数组中的某个位置的元素修改为一个大于0的整数。请问最......
  • 【web 开发】PHP8中数组的序列化和反序列化
    前言数组的序列化(serialize)用来将数组的数据转换为字符串,以方便传递和数据库的存储。与之相对应的操作就是反序列化(unserialize),把字符串数据转换为数组加以使用。数组的序列化主要通过serialize()函数来完成。字符串的反序列化主要通过unserialize()函数来完成。对象的序列化与反序......