算法day06

第一題

1658.?將 x 減到 0 的最小操作數

如題上述:

? ? ? ? 本題原來的意思給定一個數字x,從數組的左邊或者右邊?使用x減去數組中的數字,直到減去最后一個數字為0時,返回最小的操作次數;如果最終減去的數組中的數字之后不能得到0,則返回-1;

? ? ? ? 我們由正難則反原理將題意轉化為如下所示:

? ? ? ? 如上圖所示,我們使用滑動窗口模型,讓窗口內的子數組之和為sum-x,左邊區域和右邊區域的數組之和為x,為了保證左右區間的數組長度最小,則中間區域的數組長度需要最長;

? ? ? ? 故此解題步驟如下所示:

步驟一:

? ? ? ? 定義左右雙指針;

步驟二:

? ? ? ? 進窗口:

? ? ? ? 右指針移動一位,并記錄sum在案;

步驟三:

? ? ? ? 判斷出窗口操作:

? ? ? ? 如果tar>sum-x,則開始出窗口操作,直到不滿足剛剛上述條件;

? ? ? ? 所謂出窗口操作則是,sum減去當前左指針所指的數值,并且左指針右移一位;

? ? ? ? 注意每一次出完窗口操作之后要更新中間數組區域的長度;

最后返回的結果是-1or整個數組長度-之前記錄的數組長度;

? ? ? ? 綜上所述,代碼如下:

class Solution {public int minOperations(int[] nums, int x) {int sum =  0;for(int a : nums){sum += a;}int tar = sum - x;if(tar < 0){return -1;}int temp = 0,res = -1;for(int left = 0,right = 0;right < nums.length;right++){temp += nums[right];while(temp > tar){temp -= nums[left++];}if(temp == tar){res = Math.max(res,right-left+1);}}if(res == -1){return res;}else{return nums.length-res;}}
}

第二題

? ? ? ? 904.?水果成籃 ?

?由上題可知:

? ? ? ? 本題的意思可以轉化為在一個最長的數組,且里面的元素種類不能超過2;

? ? ? ? 本題采用滑動模塊的思想,解題步驟如下所示:

步驟一:

? ? ? ? 定義左右雙指針;

步驟二:

? ? ? ? 進窗口操作:

? ? ? ? 右指針移動一位,將其所指的元素放在hash表里面

步驟三:

? ? ? ? 判斷操作:

? ? ? ? 當hash表的長度大于2時,hash表中左指針的元素先-1,判斷左指針所值的元素是否是否為0,如果為零,將該元素移除hash表,反之不然,同時將左指針向前移動一位;即完成出窗口操作,最后更新當前窗口的長度并記錄在案;

? ? ? ? 返回最長的窗口的長度;

? ? ? ? 代碼如下所示:

class Solution {public int totalFruit(int[] fruits) {Map<Integer,Integer> hash = new HashMap<Integer,Integer>();int res = 0;for(int left = 0,right = 0;right < fruits.length;right ++){int in = fruits[right];hash.put(in,hash.getOrDefault(in,0)+1);while(hash.size() > 2){int out = fruits[left]; hash.put(out,hash.get(out)-1);if(hash.get(out)== 0){hash.remove(out);}left ++;}res = Math.max(res,right-left+1);}return res;}
}

下面用數組代表hash表,如下所示:

class Solution {public int totalFruit(int[] fruits) {   int res = 0,n = fruits.length;int[] hash = new int[n+1];for(int left = 0,right = 0,kinds = 0;right < n;right ++){int in = fruits[right];if(hash[in] == 0){kinds++;}hash[in]++;while(kinds > 2){int out = fruits[left]; hash[out] --;if(hash[out]== 0){kinds --;}left ++;}res = Math.max(res,right-left+1);}return res;}
}

?第三題

438.?找到字符串中所有字母異位詞

題目如上所示:

? ? ? ? 首先如何能夠快速的判斷出相同的異位詞,只有采用hash表;

? ? ? ? 其次本次采用滑動窗口和hash表的方法來解決;

解題步驟如下:

步驟一:

? ? ? ? 定義所有雙指針;

步驟二:進窗口

? ? ? ? ?當前右指針所指的字符映射到hash表中的位置中,該位置上記錄的是該元素當前在窗口中的數目;每當有字符進入到窗口,其對應的hash表中的相應位置會記錄該字符的存在數量;

步驟三:

? ? ? ? 當前左右指針所指的窗口的長度是否和固定數組的長度m比較:

? ? ? ? 窗口長度大于m:

? ? ? ? ? ? ? ? 在hash表中減去當前左指針所映射位置的數量,即該元素所記錄的數量減一,同時左指針向右移動一位;

? ? ? ? 此時得到一個新的窗口,這時候要更新我們的結果,即檢查兩個hash表是否一致;

步驟四:關于兩個hash表進行比較的簡單方法:

????????

? ? ? ? 如圖所示,定義一個count變量,來記錄有效hash2表中字符的總數量,如當前hash1中需求有效字符數量為3,所以我們需要確定更新結果的前提就是hash2中所統計的count=3時,就要返回該子數組的第一個元素下標,詳細加分析如下所示:

? ? ? ? 進窗口后:如果當前該字符對應hash表中的記錄數目小于該元素的有效數目,則count變量加一;

? ? ? ? 出窗口前:如果當前該字符對應hash表中的記錄數目小于該元素的有效數目,則count變量減一;

? ? ? ? 當所記錄的count==需要的值m時,我們要更新結果:

其中代碼如下所示:

class Solution {public List<Integer> findAnagrams(String s, String p) {List<Integer> ret = new ArrayList<Integer> ();char[] s1 = s.toCharArray();char[] p1 = p.toCharArray();int[] hash1 = new int[26];for(char ch: p1){hash1[ch-'a']++;}int[] hash2 = new int[26];int m = p1.length;for(int left = 0,right = 0,count =0;right < s1.length;right++){char in = s1[right];hash2[in -'a']++;if(hash2[in-'a']<=hash1[in-'a']){count++;}if(right - left + 1 > m){char out = s1[left++];if(hash2[out-'a'] <= hash1[out-'a']){count--;}hash2[out-'a']--;}if(count == m){ret.add(left);}}return ret;}
}

ps:本次的內容就到這里了,如果大家感興趣的話沒救請一鍵三連哦!!!

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

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

相關文章

HR系統組合漏洞挖掘過程

前言 某天在項目中遇到了一個奇怪的人才管理系統&#xff0c;通過FOFA&#xff08;會員可在社區獲取&#xff09;進行了一番搜索&#xff0c;發現了該系統在互聯網上的使用情況相當廣泛。于是&#xff0c;我開始了后續的審計過程。 在搜索過程中&#xff0c;我偶然間找到了一份…

「TypeScript系列」TypeScript 基礎類型

文章目錄 一、TypeScript 基礎類型1. **Number**: 用于表示數字。可以是整數或浮點數。2. **String**: 用于表示文本類型的數據。3. **Boolean**: 表示邏輯值&#xff1a;true 或 false。4. **Array**: 表示一組值。TypeScript 使用泛型&#xff08;generics&#xff09;來定義…

Mysql存儲引擎對比

存儲引擎InnoDBMyISAM文件存儲結構.frm文件&#xff1a;存放表結構的定義信息 .ibd文件或.ibdata文件&#xff1a;存放InnoDB數據&#xff08;數據和索引&#xff09;【獨享表空間】每個表一個.ibd文件【共享表空間】所有表使用一個.ibdata文件- .frm文件&#xff1a;存放表結構…

Nginx靜態壓縮和代碼壓縮,提高訪問速度!

一、概述 基于目前大部分的應用&#xff0c;都使用了前后端分離的框架&#xff0c;vue的前端應用&#xff0c;也是十分的流行。不知道大家有沒有遇到這樣的問題&#xff1a; 隨著前端框架的頁面&#xff0c;功能開發不斷的迭代&#xff1b;安裝的依賴&#xff0c;不斷的增多&a…

機器學習【簡述】

什么是機器學習 機器學習研究的是計算機怎么模擬人類的學習行為&#xff0c;以獲取的知識或技能&#xff0c;并重新組織已有的知識結構使之不斷改善自身。簡單一點說&#xff0c;就是計算機從數據中學習初規律和模式&#xff0c;以應用在新數據上做預測的任務。近年來互聯網數…

無人機的用途

無人機&#xff0c;即無人駕駛飛機&#xff0c;其用途廣泛且多樣&#xff0c;涉及到多個領域。 在農業領域&#xff0c;無人機通過搭載各種傳感器和相機&#xff0c;可以對農田進行空中巡視&#xff0c;收集農田數據&#xff0c;如土壤含水量、氣溫、濕度等&#xff0c;以及植…

詳細的性能分析和調優的示例過程:

當面臨數據庫查詢性能下降的問題時&#xff0c;以下是一個詳細的性能分析和調優的示例過程&#xff1a; ### 1. 監控和識別問題 假設你負責維護一個電子商務網站數據庫&#xff0c;最近用戶反映搜索功能響應慢。你立即使用數據庫監控工具&#xff08;如Prometheus、Grafana&am…

Ardupilot開源飛控工程項目編譯回顧

Ardupilot開源飛控工程項目編譯回顧 1. 源由2. 工程編譯3. 命令列表3.1 工作環境設置3.2 獲取工程代碼3.3 建立編譯環境3.4 編譯工程代碼3.5 保存編譯結果3.6 清理編譯結果3.7 編譯設備目標 4. 補充 1. 源由 最近&#xff0c;有點莫名的連續遇到了2次Ardupilot編譯報錯。百思不…

Quartz.Net(2)——NetCore3.1整合Quartz.Net

在上篇文章中Quartz.Net(1) 已經介紹了Quartz.Net的基本運用&#xff0c;該篇文章中將主要介紹NetCore3.1如何整合Quartz.Net&#xff0c;在后臺運行定時job&#xff0c;并運用到上篇文章講到的介紹點。 1 導入Nuget包 <PackageReference Include"Quartz" Versio…

PyTorch中的torch.cuda.amp.autocast

torch.cuda.amp.autocast的使用 torch.cuda.amp.autocast是PyTorch中一種自動混合精度計算的方法&#xff0c;它允許在深度學習模型的訓練過程中自動執行混合精度計算&#xff0c;從而加快訓練速度并減少顯存占用。 在使用torch.cuda.amp.autocast時&#xff0c;一般會將模型…

Ubuntu系統如何使用寶塔面板搭建HYBBS論壇并發布公網遠程訪問

文章目錄 前言1. HYBBS網站搭建1.1 HYBBS網站安裝1.2 HYBBS網站測試1.3. cpolar的安裝和注冊 2. 本地網頁發布2.1.Cpolar臨時數據隧道2.2.Cpolar穩定隧道&#xff08;云端設置&#xff09;2.3.Cpolar穩定隧道&#xff08;本地設置&#xff09; 3.公網訪問測試總結 前言 在國內…

【智能算法】河馬優化算法(HO)原理及實現

目錄 1.背景2.算法原理2.1算法思想2.2算法過程 3.結果展示4.參考文獻5.代碼獲取 1.背景 2024年&#xff0c;MH Amiri受到自然界河馬社會行為啟發&#xff0c;提出了河馬優化算法&#xff08;Hippopotamus Optimization Algorithm, HO&#xff09;。 2.算法原理 2.1算法思想 …

動態IP的應用場景

動態IP適用于網絡設備規模較小、需要靈活連接網絡、經濟條件有限或者需要臨時建立網絡的場景。

【C++】AVL

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 目錄 前言 一、AVL 樹 1.1、AVL樹的概念 1.2、AVL樹節點的定義 1.3、AVL樹的插入 1.4、AVL樹的旋轉 1.4.1、新節點插入較高左子樹的左側---左左&#xff1a;右單旋 1…

Spring整體流程源碼分析

DisableEncodeUrlFilter 防止sessionId被泄露 包裝器模式 WebAsyncManagerIntegrationFilter WebAsyncManagerIntegrationFilter通常與Spring MVC的異步請求處理機制一起使用&#xff0c;確保在使用Callable或DeferredResult等異步處理方式時&#xff0c;安全上下文能夠正…

CSP備考---位運算

前言 本期我們將學習位運算&#xff0c;與本期類型的考點&#xff08;二進制轉換&#xff09;反碼、補碼、原碼。 1、位運算是什么 首先我們需要先了解位運算是什么。 我們知道&#xff0c;計算機中的數在內存中都是以二進制形式進行存儲的 &#xff0c;而位運算就是直接對整…

332_C++_mmap 映射文件或設備到進程的地址空間,或者創建一個新的映射區域

mmap : 映射文件或設備到進程的地址空間,或者創建一個新的映射區域(通常是匿名的) mmap 是 Linux 和其他類 Unix 系統中的一個系統調用,用于映射文件或設備到進程的地址空間,或者創建一個新的映射區域(通常是匿名的)。mmap 提供了靈活的方式來管理內存,它經常用于實現…

打造本地GPT專業領域知識庫AnythingLLM+Ollama

如果你覺得openai的gpt沒有隱私&#xff0c;或者需要離線使用gpt&#xff0c;還是打造專業領域知識&#xff0c;可以借用AnythingLLMOllama輕松實現本地GPT. AnythingLLMOllama 實現本地GPT步聚&#xff1a; 1 下載 AnythingLLM軟件 AnythingLLM官網地址&#xff1a; Anythi…

功能卓越,未來可期!實在Agent智能體公測圓滿收官

“被需要的智能才是實實在在的智能。”一直以來&#xff0c;實在智能始終堅持從行業本質出發思考如何圍繞客戶需求打造更智能、更普惠的智能體數字員工&#xff0c;切實關注用戶真實的使用體驗與感受。 自2020年7月起&#xff0c;實在智能率先推出第一代實在RPA數字員工&#…

SpringBoot設置默認文件大小

1、問題發現 有個需求&#xff0c;上傳文件的時候&#xff0c;發現提示了這個錯誤&#xff0c;看了一下意思是說&#xff0c;文件超過了1M。 看我們文件的大小&#xff1a; 發現確實是&#xff0c;文件超出了1M&#xff0c;查了一下資料&#xff0c;tomcat默認上傳文件大小為1M…