二分查找|前綴和|滑動窗口|2302:統計得分小于 K 的子數組數目

作者推薦

貪心算法LeetCode2071:你可以安排的最多任務數目

本文涉及的基礎知識點

二分查找算法合集

題目

一個數組的 分數 定義為數組之和 乘以 數組的長度。
比方說,[1, 2, 3, 4, 5] 的分數為 (1 + 2 + 3 + 4 + 5) * 5 = 75 。
給你一個正整數數組 nums 和一個整數 k ,請你返回 nums 中分數 嚴格小于 k 的 非空整數子數組數目。
子數組 是數組中的一個連續元素序列。
示例 1:
輸入:nums = [2,1,4,3,5], k = 10
輸出:6
解釋:
有 6 個子數組的分數小于 10 :

  • [2] 分數為 2 * 1 = 2 。
  • [1] 分數為 1 * 1 = 1 。
  • [4] 分數為 4 * 1 = 4 。
  • [3] 分數為 3 * 1 = 3 。
  • [5] 分數為 5 * 1 = 5 。
  • [2,1] 分數為 (2 + 1) * 2 = 6 。
    注意,子數組 [1,4] 和 [4,3,5] 不符合要求,因為它們的分數分別為 10 和 36,但我們要求子數組的分數嚴格小于 10 。
    示例 2:
    輸入:nums = [1,1,1], k = 5
    輸出:5
    解釋:
    除了 [1,1,1] 以外每個子數組分數都小于 5 。
    [1,1,1] 分數為 (1 + 1 + 1) * 3 = 9 ,大于 5 。
    所以總共有 5 個子數組得分小于 5 。
    參數范圍
    1 <= nums.length <= 105
    1 <= nums[i] <= 105
    1 <= k <= 1015

二分查找、前綴和

代碼

時間復雜度

O(nlogn)。枚舉子數組起點,時間復雜度O(n);二分查找終點:時間復雜度O(logn)。

原理

尋找最后一個符合以下條件的vNumRight,故用左閉右開空間。vNumRight的取值范圍是[vNumLeft,m_c],換成左閉右開空間是[vNumLeft,m_c+1)。nums[vNumLeft,vNumRight) 就是要判斷的子數組。

核心代碼

class Solution {
public:long long countSubarrays(vector<int>& nums, long long k) {m_c = nums.size();vector<long long> vPreSum = { 0 };for (const auto& n : nums){vPreSum.emplace_back(vPreSum.back() + n);}long long llRet = 0;for (int vNumLeft = 0; vNumLeft < m_c; vNumLeft++){//求最大的vNumRight,使得nums[vNumLeft,vNumRight)的得分小于k。左閉右開int left = vNumLeft, right = m_c + 1;while (right - left > 1){const auto mid = left + (right - left) / 2;if ((vPreSum[mid] - vPreSum[vNumLeft])*(mid-vNumLeft) < k){left = mid;}else{right = mid;}}llRet += left - vNumLeft;}return llRet;}int m_c;
};

測試用例

template
void Assert(const vector& v1, const vector& v2)
{
if (v1.size() != v2.size())
{
assert(false);
return;
}
for (int i = 0; i < v1.size(); i++)
{
assert(v1[i] == v2[i]);
}
}

template
void Assert(const T& t1, const T& t2)
{
assert(t1 == t2);
}

int main()
{
vector nums;
long long k,res;
{
Solution slu;
nums = { 2, 1, 4, 3, 5 }, k = 10;
auto res = slu.countSubarrays(nums, k);
Assert(6LL, res);
}
{
Solution slu;
nums = { 1,1,1 }, k =5;
auto res = slu.countSubarrays(nums, k);
Assert(5LL, res);
}
{
Solution slu;
nums = { 9,5,3,8,4,7,2,7,4,5,4,9,1,4,8,10,8,10,4,7 }, k = 4;
auto res = slu.countSubarrays(nums, k);
Assert(3LL, res);
}
//CConsole::Out(res);
}

滑動窗口

時間復雜度O(n)

由于是正整數,所以子數組起點相同,終點越大,積分越大。相同的left,right不斷增大。left增大,right不變或變大。left循環O(n)次,right也是。right總共循環了o(n),每次都是接著上次的right開始,沒有重新開始。

代碼

class Solution {
public:long long countSubarrays(vector<int>& nums, long long k) {m_c = nums.size();long long llSum = 0;long long llRet = 0;for (int left = 0,right=0; left < m_c; left++){//子數組nums[left,right)符合要求,且right是當前left的最大值while ((right < m_c) && ((llSum+nums[right]) * (right+1 - left) < k)){llSum += nums[right++];}llRet += right - left;llSum -= nums[left];}	return llRet;}int m_c;
};

擴展閱讀

視頻課程

有效學習:明確的目標 及時的反饋 拉伸區(難度合適),可以先學簡單的課程,請移步CSDN學院,聽白銀講師(也就是鄙人)的講解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成戰斗了,為老板分憂,請學習C#入職培訓、C++入職培訓等課程
https://edu.csdn.net/lecturer/6176

相關下載

想高屋建瓴的學習算法,請下載《喜缺全書算法冊》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想對大家說的話
聞缺陷則喜是一個美好的愿望,早發現問題,早修改問題,給老板節約錢。
子墨子言之:事無終始,無務多業

。也就是我們常說的專業的人做專業的事。 |
|如果程序是一條龍,那算法就是他的是睛|

測試環境

操作系統:win7 開發環境: VS2019 C++17
或者 操作系統:win10 開發環境:

VS2022 C++17

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208808.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208808.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208808.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

response應用及重定向和request轉發

請求和轉發&#xff1a; response說明一、response文件下載二、response驗證碼實現1.前置知識&#xff1a;2.具體實現&#xff1a;3.知識總結 三、response重定向四、request轉發五、重定向和轉發的區別 response說明 response是指HttpServletResponse,該響應有很多的應用&…

JavaScript 一些少見多怪的玩意

$$() [].forEach.call($$("*"), function (a) {a.style.outline "1px solid #" (~~(Math.random() * (1 << 24))).toString(16);}); 直接復制到控制臺&#xff0c;頁面效果就是頁面中不同的HTML結構被不同顏色的框圈著。 原理&#xff1a; $$函數…

力扣面試150題 | 輪轉數組

力扣面試150題 &#xff5c; 輪轉數組 題目描述解題思路代碼實現 題目描述 189.輪轉數組 給定一個整數數組 nums&#xff0c;將數組中的元素向右輪轉 k 個位置&#xff0c;其中 k 是非負數。 示例 1: 輸入: nums [1,2,3,4,5,6,7], k 3 輸出: [5,6,7,1,2,3,4] 解釋: 向右輪…

Kafka在微服務架構中的應用:實現高效通信與數據流動

微服務架構的興起帶來了分布式系統的復雜性&#xff0c;而Kafka作為一款強大的分布式消息系統&#xff0c;為微服務之間的通信和數據流動提供了理想的解決方案。本文將深入探討Kafka在微服務架構中的應用&#xff0c;并通過豐富的示例代碼&#xff0c;幫助大家更全面地理解和應…

PaddleClas學習3——使用PPLCNet模型對車輛朝向進行識別(c++)

使用PPLCNet模型對車輛朝向進行識別 1 準備環境2 準備模型2.1 模型導出2.2 修改配置文件3 編譯3.1 使用CMake生成項目文件3.2 編譯3.3 執行3.4 添加后處理程序3.4.1 postprocess.h3.4.2 postprocess.cpp3.4.3 在cls.h中添加函數聲明3.4.4 在cls.cpp中添加函數定義3.4.5 在main.…

時間序列預測 — VMD-LSTM實現單變量多步光伏預測(Tensorflow):單變量轉為多變量

目錄 1 數據處理 1.1 導入庫文件 1.2 導入數據集 1.3 缺失值分析 2 VMD經驗模態分解 3 構造訓練數據 4 LSTM模型訓練 5 預測 1 數據處理 1.1 導入庫文件 import time import datetime import pandas as pd import numpy as np import matplotlib.pyplot as plt f…

優化算法 學習記錄

文章目錄 相關資料 優化算法梯度下降學習率牛頓法 隨機梯度下降小批量隨機梯度下降動量法動量法解決上述問題 AdaGrad 算法RMSProp算法Adam學習率調度器余弦學習率調度預熱 相關資料 李沐 動手學深度學習 優化算法 優化算法使我們能夠繼續更新模型參數&#xff0c;并使損失函…

Elasticsearch:使用 Elasticsearch 向量搜索及 RAG 來實現 Chatbot

Elasticsearch 的向量搜索為我們的語義搜索提供了可能。而在人工智能的動態格局中&#xff0c;檢索增強生成&#xff08;Retrieval Augmented Generation - RAG&#xff09;已經成為游戲規則的改變者&#xff0c;徹底改變了我們生成文本和與文本交互的方式。 RAG 使用大型語言模…

Android TextView 超出省略失效 解決方法

解決方法 我是在使用 ConstraintLayout 嵌套 LinearLayout 水平方向&#xff0c;TextView 又使用layout_weight&#xff08;權重&#xff09;情況下出現這種問題&#xff0c;最后將layout_width從 0dp 改為 1dp 得以解決。 <androidx.constraintlayout.widget.ConstraintLa…

MongoDB的刪除文檔、查詢文檔語句

本文主要介紹MongoDB的刪除文檔、查詢文檔命令語句。 目錄 MongoDB刪除文檔MongoDB查詢文檔 MongoDB刪除文檔 MongoDB是一種基于文檔的NoSQL數據庫&#xff0c;它使用BSON格式存儲文檔。刪除文檔是MongoDB數據庫中的常見操作之一。 下面是MongoDB刪除文檔的詳細介紹和示例&am…

當年為什么選擇計算機?

確切的來說不是遠的計算機&#xff0c;高考那會計算機很熱門&#xff0c;根本考不上&#xff01;學習了一個和計算機關系很密切的專業&#xff0c;編程搞得好&#xff0c;才能找到好工作&#xff0c;才能有飯吃&#xff01;記得當年我還跑去武漢大學的計算機課堂和人家一起聽課…

導入自定義模塊出現紅色波浪線,但是能正常執行

問題描述&#xff1a; 導入自己定義的模塊時&#xff0c;出現紅色波浪線&#xff0c;可以繼續執行 解決&#xff1a; 在存放當前執行文件的文件夾右鍵&#xff0c;然后將其設置為sources root即可 結果&#xff1a;

基于深度學習yolov5實現安全帽人體識別工地安全識別系統-反光衣識別系統

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 實現安全帽人體識別工地安全識別系統需要使用深度學習技術&#xff0c;特別是YOLOv5算法。下面是對基于YOLOv5實現安…

帶你真正理解web地圖切片規則

很多時候我們即使做完了項目還是對切片規則一知半解&#xff0c;只知道照著例子寫代碼&#xff0c;不理解WMTSCapabilities文件中參數的具體含義&#xff0c;也無法理解切片規則是如何產生的&#xff0c;不知道經緯度切圖和平面切圖的差別是啥&#xff0c;等等種種疑問&#xf…

Leetcode 39 組合總和

題意理解&#xff1a; 一個 無重復元素 的整數數組 candidates 和一個目標整數 target 從candidates 取數字&#xff0c;使其和 target &#xff0c;有多少種組合&#xff08;candidates 中的 同一個 數字可以 無限制重復被選取&#xff09; 這道題和之前一道組合的區別&am…

Vue學習筆記-Vue3中setup函數注意點

setup編寫示例 <script> import {reactive} from vue export default {name: "DemoVue",props:[xxx,yy,...],setup(props,context){const data reactive({......})//setup必須有返回值return {data,}} } </script>setup執行的時機 在beforeCreate()之…

【51單片機系列】74HC595實現對LED點陣的控制

本文是關于LED點陣的使用&#xff0c;使用74HC595模塊實現對LED點陣的控制。 文章目錄 一、8x8LED點陣的原理1.1 LED點陣顯示原理1.2 LED點陣內部結構圖1.3 開發板上的LED點陣原理圖1.4 74HC595芯片 二、使用74HC595模塊實現流水燈效果三、 使用74HC595模塊控制LED點陣對角線亮…

python基于DeeplabV3Plus開發構建手機屏幕表面缺陷圖像分割識別系統

Deeplab是圖像分割領域非常強大的模型&#xff0c;在前面的博文中我們也進行過很多相應項目的開發實踐&#xff0c;感興趣的話可以自行移步閱讀即可&#xff1a; 《基于DeepLabv3Plus開發構建人臉人像分割系統》 《基于DeepLabV3實踐路面、橋梁、基建裂縫裂痕分割》 《基于D…

【鏈表Linked List】力扣-203 移除鏈表元素

目錄 題目描述 解題過程 題目描述 給你一個鏈表的頭節點 head 和一個整數 val &#xff0c;請你刪除鏈表中所有滿足 Node.val val 的節點&#xff0c;并返回 新的頭節點 。 示例 1&#xff1a; 輸入&#xff1a;head [1,2,6,3,4,5,6], val 6 輸出&#xff1a;[1,2,3,4,5…

快速學會繪制Pyqt5中的所有圖(下)

Pyqt5相關文章: 快速掌握Pyqt5的三種主窗口 快速掌握Pyqt5的2種彈簧 快速掌握Pyqt5的5種布局 快速弄懂Pyqt5的5種項目視圖&#xff08;Item View&#xff09; 快速弄懂Pyqt5的4種項目部件&#xff08;Item Widget&#xff09; 快速掌握Pyqt5的6種按鈕 快速掌握Pyqt5的10種容器&…