每日算法刷題Day14 5.24:leetcode不定長滑動窗口求子數組個數越長越合法4道題,用時1h20min

  • 3. 3325.字符至少出現K次的子字符串I(中等,學習優化)

3325. 字符至少出現 K 次的子字符串 I - 力扣(LeetCode)

思想

1.給你一個字符串?s?和一個整數?k,在?s?的所有子字符串中,請你統計并返回?至少有一個?字符?至少出現?k?次的子字符串總數。
2.我的思路是用unordered_map記錄字符次數,但是每次while循環判斷條件都要遍歷一遍unordered_map,耗時太大
3.學習:只需判斷cnt[s[right]]>=k即可,因為當前只有右端點right字符移入窗口增加次數,而對于此刻也只有它有可能超過K(因為每次while循環結束保證都沒有字符次數超過K,從而進入下一輪for循環)
4.給你一個整數數組?nums?和一個整數?k?,請你返回?nums?中?好?子數組的數目。一個子數組?arr?如果有?至少?k?對下標?(i, j)?滿足?i < j?且?arr[i] == arr[j]?,那么稱它是一個??子數組。(窗口條件)(假設當前窗口中值為nums[right]已有x對,那么right元素進來會增加x對,left出去會減少x-1對)

代碼

c++:
1.我的代碼

class Solution {
public:bool check(const unordered_map<char, int> cnt, const int k) {for (auto x : cnt) {if (x.second >= k)return true;}return false;}int numberOfSubstrings(string s, int k) {int n = s.size();unordered_map<char, int> cnt;int res = 0;int left = 0;for (int right = 0; right < n; ++right) {++cnt[s[right]];while (check(cnt, k)) {--cnt[s[left]];++left;}res += left;}return res;}
};

2.學習

class Solution {
public:int numberOfSubstrings(string s, int k) {int n = s.size();unordered_map<char, int> cnt;int res = 0;int left = 0;for (int right = 0; right < n; ++right) {++cnt[s[right]];while (cnt[s[right]] >= k) {--cnt[s[left]];++left;}res += left;}return res;}
};

3.拓展,如果題目條件改成統計并返回?至少有兩個?字符?至少出現?k?次的子字符串總數,需要再引入一個字符次數變量,也無需全部遍歷cnt

class Solution {
public:int numberOfSubstrings(string s, int k) {int n = s.size();unordered_map<char, int> cnt;int res = 0;int left = 0;int charCnt=0;for (int right = 0; right < n; ++right) {++cnt[s[right]];if(cnt[s[right]] == k) ++charCnt;while (charCnt >= 2) { // 更通用的方法--cnt[s[left]];if(cnt[s[left]]==k-1) --charCnt;++left;}res += left;}return res;}
};
  • 4. 2799.統計完全子數組的數目(中等)

2799. 統計完全子數組的數目 - 力扣(LeetCode)

思想

1.如果數組中的某個子數組滿足下述條件,則稱之為?完全子數組?:子數組中?不同?元素的數目等于整個數組不同元素的數目。返回數組中?完全子數組?的數目。
2.unordered_set計算整個數組不同元素的數目,unordered_map計算子數組中不同元素的數目
3.使用unordered_set<int> st(nums.begin(), nums.end());通過迭代器來初始化構造,方便快捷

代碼

c++:

class Solution {
public:int countCompleteSubarrays(vector<int>& nums) {int n = nums.size();int res = 0;unordered_set<int> st(nums.begin(), nums.end());unordered_map<int, int> cnt;int k = st.size();int left = 0;for (int right = 0; right < n; ++right) {++cnt[nums[right]];while (cnt.size() == k) {--cnt[nums[left]];if (cnt[nums[left]] == 0)cnt.erase(nums[left]);++left;}res += left;}return res;}
};
  • 5. 2537.統計好子數組的數目

2537. 統計好子數組的數目 - 力扣(LeetCode)

思想

1.給你一個整數數組?nums?和一個整數?k?,請你返回?nums?中??子數組的數目。一個子數組?arr?如果有?至少?k?對下標?(i, j)?滿足?i < j?且?arr[i] == arr[j]?,那么稱它是一個??子數組。
2.思路:
對于當前的for循環,假設窗口中值為nums[right]已有x對,那么right元素進來會增加x對,left出去會減少x-1對(就是考慮right進來和left出去會對統計量產生什么影響,只要管right和left即可)

代碼

c++:

class Solution {
public:long long countGood(vector<int>& nums, int k) {int n = nums.size();long long res = 0;long long sum = 0;map<int, long long> cnt;int left = 0;for (int right = 0; right < n; ++right) {sum += cnt[nums[right]];++cnt[nums[right]];while (sum >= k) {--cnt[nums[left]];sum -= cnt[nums[left]];++left;}res += left;}return res;}
};
  • 6. 2495.乘積為偶數的子數組數(中等,學習)

2495. 乘積為偶數的子數組數 - 力扣(LeetCode)

思想

1.給定一個整數數組?nums,返回_具有偶數乘積的_?nums?子數組的數目
2.我的一開始思路是用bool遍歷維護奇偶性,但是增加right元素可以,移出left元素就不行了,故還是采用了乘積來判斷,會超內存
3.學習:只要窗口內有一個偶數乘積就是偶數,所以轉變為偶數個數至少為1的子數組數目

代碼

c++:
1.我的

class Solution {
public:long long evenProduct(vector<int>& nums) {int n=nums.size();long long res=0;unsigned long long product=1;int left=0;for(int right=0;right<n;++right){product*=(unsigned long long)nums[right];while(!(product&1)){product/=(unsigned long long)nums[left];++left;}res+=left;}return res;}
};

2.學習

class Solution {
public:long long evenProduct(vector<int>& nums) {int n = nums.size();long long res = 0;int cnt = 0;int left = 0;for (int right = 0; right < n; ++right) {if (!(nums[right] & 1))++cnt;while (cnt >= 1) {if (!(nums[left] & 1))--cnt;++left;}res += left;}return res;}
};

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

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

相關文章

怎么判斷一個Android APP使用了Capacitor這個跨端框架

要判斷一個 Android 應用是否使用了 Capacitor 跨端框架&#xff0c;可以通過以下方法逐步驗證&#xff1a; 一、安裝包結構分析 1. 解壓 APK 將 .apk 文件重命名為 .zip 并解壓&#xff0c;檢查以下特征文件&#xff1a; ? assets/public/ 目錄&#xff1a; Capacitor 的核心…

Vue3性能優化: 大規模列表渲染解決方案

# Vue3性能優化: 大規模列表渲染解決方案 一、背景與挑戰 背景 在大規模應用中&#xff0c;Vue3的列表渲染性能一直是開發者關注的焦點。大規模列表渲染往往會導致卡頓、內存占用過高等問題&#xff0c;影響用戶體驗和系統整體性能。 挑戰 渲染大規模列表時&#xff0c;DOM操作…

數據倉庫,掃描量

有五種通用技術用于限制數據的掃描量&#xff0c;正如圖3 - 4所示。第一種技術是掃描那些被打上時戳的數據。當一個應用對記錄的最近一次變化或更改打上時戳時&#xff0c;數據倉庫掃描就能夠很有效地進行&#xff0c;因為日期不相符的數據就接觸不到了。然而&#xff0c;目前的…

反射在spring boot自動配置的應用

目錄 一&#xff0c;背景 二&#xff0c;知識回顧 2.1 理解使用反射技術&#xff0c;讀取配置文件創建目標對象&#xff08;成員變量&#xff0c;方法&#xff0c;構造方法等&#xff09; 三&#xff0c;springboot自動配置 3.1 反射在自動配置中的工作流程 3.2 瀏覽源碼…

機器學習 Day1

機器學習概述 機器學習與人工智能、深度學習關系什么是機器學習數據集算法 機器學習與人工智能、深度學習關系 什么是機器學習 機器學習是從數據中自動分析獲取模型&#xff0c;并利用模型對未知數據進行預測。 直觀理解: 所以是從歷史數據中獲取規律&#xff0c;那么這些歷…

Disruptor—2.并發編程相關簡介

大綱 1.并發類容器 2.volatile關鍵字與內存分析 3.Atomic系列類與UnSafe類 4.JUC常用工具類 5.AQS各種鎖與架構核心 6.線程池的最佳使用指南 1.并發類容器 (1)ConcurrentMap (2)CopyOnWrite容器 (3)ArrayBlockingQueue (4)LinkedBlockingQueue (5)SynchronousQueue …

開盤啦 APP 抓包 逆向分析

聲明: 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 抓包 這是一個記錄貼。 這個APP是數…

YOLOv8損失函數代碼詳解(示例展示數據變換過程)

本文將展示YOLOv8中損失函數計算的完整代碼解析&#xff0c;注釋中提供了詳盡的解釋&#xff0c;并結合示例演示了數據維度的轉換&#xff0c;以幫助更好地理解。 YOLOv8的損失函數計算代碼位于ultralytics/utils/loss.py文件中&#xff08;如下所示&#xff09;&#xff0c;我…

微信小程序調用藍牙API “wx.writeBLECharacteristicValue()“ 報 errCode: 10008 的解決方案

1、問題現象 問題:在開發微信小程序藍牙通信功能時,常常會遇到莫名其妙的錯誤,查閱官方文檔可能也無法找到答案。如在寫入藍牙數據時,報了這樣的錯誤: {errno: 1500104, errCode: 10008, errMsg: "writeBLECharacteristicValue:fail:system error, status: UNKNOW…

軟考 UML中的 用例圖 的泛化 包含 擴展 關系

用例圖的泛化、擴展和包含 - ^_^肥仔John - 博客園

MyBatis-Plus的自帶分頁方法生成的SQL失敗:The error occurred while setting parameters

1、error描述 數據庫是postgres&#xff0c;Java使用mybatis-plus的分頁功能&#xff0c;生成的分頁SQL不能正常運行。 "msg": "nested exception is org.apache.ibatis.exceptions.PersistenceException: Error querying database. Cause: com.baomidou.my…

Redis從入門到實戰 - 原理篇

一、數據結構 1. 動態字符串SDS 我們都知道Redis中保存的key是字符串&#xff0c;value往往是字符串或者字符串的集合。可見字符串是Redis中最常用的一種數據結構。 不過Redis沒有直接使用C語言中的字符串&#xff0c;因為C語言字符串存在很多問題&#xff1a; 獲取字符串長…

人形機器人通過觀看視頻學習人類動作的技術可行性與前景展望

摘要 本文深入探討人形機器人通過觀看視頻學習人類動作這一技術路線的正確性與深遠潛力。首先闡述該技術路線在模仿人類學習過程方面的優勢&#xff0c;包括對人類動作、表情、發音及情感模仿的可行性與實現路徑。接著從技術原理、大數據訓練基礎、與人類學習速度對比等角度論證…

高分辨率北半球多年凍土數據集(2000-2016)

關鍵數據集分類&#xff1a;冰凍圈數據集時間分辨率&#xff1a;10 year < x < 100 year空間分辨率&#xff1a;1km - 10km共享方式&#xff1a;開放獲取數據大小&#xff1a;339.79 MB數據時間范圍&#xff1a;2000-01-01 — 2016-12-31元數據更新時間&#xff1a;2022-…

零售智能執行大模型架構設計:從空間建模到上下文推理,再到智能Agent

零售智能執行大模型架構設計&#xff1a;從空間建模到上下文推理&#xff0c;再到智能Agent &#x1f9e0; 引言&#xff1a;零售智能執行的再定義 在傳統零售執行中&#xff0c;面對SKU數量龐雜、貨架布置多變、陳列標準難以落地等問題&#xff0c;靠人力巡檢或輕量識別模型已…

RIP 協議實驗全記錄:從配置到問題解決

在網絡世界中&#xff0c;路由協議就像是交通指揮員&#xff0c;引導數據在不同網絡之間順暢傳輸。今天&#xff0c;我們就來深入探索 RIP&#xff08;Routing Information Protocol&#xff09;協議&#xff0c;通過一系列實驗&#xff0c;揭開它的神秘面紗&#xff01; 一、搭…

基于SpringBoot的網上租賃系統設計與實現

項目簡介 本項目是基于 Spring Boot Vue 技術棧開發的 網上租賃系統。該系統通過前后端分離的架構&#xff0c;提供用戶和管理員兩種角色的操作權限&#xff0c;方便用戶進行商品租賃、訂單管理、信息查詢等操作&#xff0c;同時也為管理員提供了商品管理、用戶管理、訂單管理…

uni-app學習筆記六-vue3響應式基礎

一.使用ref定義響應式變量 在組合式 API 中&#xff0c;推薦使用 ref() 函數來聲明響應式狀態&#xff0c;ref() 接收參數&#xff0c;并將其包裹在一個帶有 .value 屬性的 ref 對象中返回 示例代碼&#xff1a; <template> <view>{{ num1 }}</view><vi…

CUDA 性能優化 | 共享內存機制 / 向量化訪存策略

注&#xff1a;本文為“CUDA 性能優化”相關文章合輯。 圖片清晰度受引文原圖所限。 重傳部分 CSDN 轉儲失敗圖片。 略作重排&#xff0c;未整理去重。 如有內容異常&#xff0c;請看原文。 Shared Memory 上的廣播機制和 Bank Conflict 到底是怎么回事&#xff1f; 發表于 2…

NVMe高速傳輸之擺脫XDMA設計1

NVMe IP放棄XDMA原因 選用XDMA做NVMe IP的關鍵傳輸模塊&#xff0c;可以加速IP的設計&#xff0c;但是XDMA對于開發者來說&#xff0c;還是不方便&#xff0c;原因是它就象一個黑匣子&#xff0c;調試也非一番周折&#xff0c;尤其是后面PCIe4.0升級。 因此決定直接采用PCIe設…