藍橋杯-動態規劃專題-子數組系列,雙指針

目錄

一、單詞拆分?

二、環繞字符串中唯一的子字符串

雙指針-三數之和

ArrayList(Arrays.asList(array))

四、四數之和(思路和三數之和一樣,只是多了一層循環)


一、單詞拆分?

1.狀態表示

dp[i]:到達i位置結尾,能否被dict拆分

最難的我認為到現在為止就是選擇狀態如何表示

dp[i]:[0,i]區間內的字符串,能否被字典中的單詞拼接而成

2.狀態轉移方程

設置j為i位置位置最后一個單詞的第一個字母

那么dp[i]->dp[j-1]==true&&s[j,i]這個字符串在dict之中

3.初始化

dp[0]=s[0]在dict中,就是true。

dp[m+1]:直接擴大一個格子,這樣他就不需要考慮邊界

我們可以讓s這個字符串前面加一個空格

這樣字符串就會往后挪動一個空格

4.順序是

從左到右

5.返回值

dp[n]

優化:既然可以有重復,重復可以一直使用,那么可以人工把這個dict中去重放到set中,這樣,重復的問題就可以不用去考慮了

簡單來說,包頭不包尾巴。

class Solution {public boolean wordBreak(String s, List<String> wordDict) {Set<String> hash=new HashSet(wordDict);int m=s.length();  boolean []dp=new boolean[m+1];//加一個占位符,可以處理下標的映射關系s=" "+s;dp[0]=true;//遍歷從1開始,是因為不去考慮邊界條件區域
//dp[i]:[0,i]區間內的字符串,能否被字典中的單詞拼接而成
//設置j為i位置位置最后一個單詞的第一個字母,i+1的原因是往后推了一個格子。
//--的原因是什么呢?他這個過程,我認為像是找最后一個單詞的第一個字母是什么,所以才會有--的原因,是因為--從最后開始遍歷去尋找
//另外,他那個sub是包頭不包尾巴,所以說那個需要到i+1,但是實際也就是j-ifor(int i=1;i<=m;i++){for(int j=i;j>=1;j--){if(dp[j-1]&& hash.contains(s.substring(j,i+1))){dp[i]=true;//假如有一個方式匹配成功了,那么就不需要別的方式了,可以直接跳出break;}}}
return dp[m];}
}

二、環繞字符串中唯一的子字符串

1.狀態表示

dp[i]:到達i為止,有dp[i]個非空字符串在base中存在過

2.狀態轉移方程

假如說連接的情況只有兩種

一種是后面減去前面的等于一

第二種就是前面的是z后面的是a相差25

假如她這個連接不起來,就是自然的單獨一個

這個時候我已經看第二個實例:在想一個問題,可不可以把它放到set里面去重,假如去重來會怎么樣?但是我又想到一個問題,假如去重了,那么假如這種abcdefghigklmnopqrstuvwxyza ,一圈之后還有個a,怎么辦,那么這樣就不能使用傳統意義上的去重,不妨使用數組(26個字母,就26個容量),然后去更新數組的值,假如a[0]==xx,那么下次在第n次的時候會再次到達,a[0]更新到最大值。

雙指針-三數之和

三數之和:采用雙指針的操作。

class Solution {public static List<List<Integer>> threeSum(int[] nums) {List<List<Integer>>ret=new ArrayList<>();int m=nums.length;Arrays.sort(nums);for(int i=0;i<m;){int left=i+1,right=m-1;int a=nums[i];while(left<right){if(nums[left]+nums[right]<-a){left++;}else if(nums[left]+nums[right]>-a){right--;}else{
//Arrays.asList():這個方法是什么意思呢?
//這個方法的意思是將數組轉化成List集合的方法。也就是說把數組這個三個元素裝入List集合里面
//(1)該方法適用于對象型數據的數組(String、Integer...)//(2)該方法不建議使用于基本數據類型的數組(byte,short,int,long,float,double,boolean)
//這個方法是使用包裝類(Integer等)//(3)該方法將數組與List列表鏈接起來:當更新其一個時,另一個自動更新//(4)不支持add()、remove()、clear()等方法ret.add(new ArrayList<Integer>(Arrays.asList(nums[i],nums[left],nums[right])));
//縮小區間繼續尋找left++;right--;
//對于去重:left是往右走,那么就是他和上一個看是不是一樣的。while(left<right&&nums[left]==nums[left-1])left++;
//right是往左走,他和右邊那個是不是一樣。while(left<right&&nums[right]==nums[right+1])right--;}}//本身的i也需要去去重,i<m,如果i和前一個i-1一樣,那么就去再次去重i++;while(i<m && nums[i]==nums[i-1])i++;}return ret;
}
}

因為left+right已經不可能會出現小于0的情況

其次我們要熟悉兩個方法

我本是對JAVA的集合方面不是很熟系,所以我會在下面再去寫一些我不熟悉的東西

List<List<Integer>>ret=new ArrayList<>();

Arrays.asList:這個方法,只推薦用于遍歷,而不推薦進行刪改等操作,它是把數組元素轉換成集合,這種方法,你在修改他的時候,也會影響到原先的數組,所以推薦是(不去用它刪除,只去遍歷)

ArrayList(Arrays.asList(array))

與?Arrays.asList?方法一樣,我們還可以使用?ArrayList<>(Arrays.asList(array))?來從 Array 創建一個 List。

但是,與上面的方法不一樣的是,使用這個方法創建的 List 是一個從老的 Array 中數據拷貝過來的,這個新的 List 與老的 Array 不相干,對新 List 中數據的操作不會影響到老的 Array 中的數據。

使用這種方法創建的 List 是可以對 List 中的元素進行添加和刪除操作的。

https://www.cnblogs.com/huyuchengus/p/15132032.html

一個關于ArrayList(Array.asList(array))和普通的Array.asList()的區別

四、四數之和(思路和三數之和一樣,只是多了一層循環)

class Solution {public  static List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>>ret=new ArrayList<>();int m=nums.length;Arrays.sort(nums);for(int i=0;i<m;){for(int j=i+1;j<m;){int left=j+1;int right=m-1;long n=(long)target-nums[i]-nums[j];while(left<right){if(nums[left]+nums[right]>n){right--;}else if(nums[left]+nums[right]<n){left++;}else{ret.add(new ArrayList<Integer>(Arrays.asList(nums[left], nums[i], nums[j], nums[right])));left++;right--;while (nums[left] == nums[left - 1] && left < right) left++;while (nums[right] == nums[right + 1] && left < right) right--;}}j++;while(j<m&&nums[j]==nums[j-1]&&j<m){j++;}}i++;while(i>0&&i<m&&nums[i]==nums[i-1])i++;}return ret;
}}

這里使用long是為了處理一組數據,因為int的數值有一定范圍,所以不可以用int去承載那么多的數,所以使用long

這里我還要講一個

if ?

else if

else

是說假如if不成立,看else if成不成立,但假如說if成立的情況下,這層循環結束,開始下一次循環,不執行下面邏輯的判斷

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

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

相關文章

Terraform實戰(二)-terraform創建阿里云資源

1 初始化環境 1.1 創建初始文件夾 $ cd /data $ mkdir terraform $ mkdir aliyun terraform作為terraform的配置文件夾&#xff0c;內部的每一個.tf&#xff0c;.tfvars文件都會被加載。 1.2 配置provider 創建providers.tf文件&#xff0c;配置provider依賴。 provider…

想學編程,但不知道從哪里學起,應該怎么辦?

怎樣學習任何一種編程語言 我將教你怎樣學習任何一種你將來可能要學習的編程語言。本書的章節是基于我和很多程序員學習編程的經歷組織的&#xff0c;下面是我通常遵循的流程。 1&#xff0e;找到關于這種編程語言的書或介紹性讀物。 2&#xff0e;通讀這本書&#xff0c;把…

MYSQL數據類型詳解

MySQL支持多種數據類型&#xff0c;這些數據類型可以分為三大類&#xff1a;數值、日期和時間以及字符串&#xff08;字符&#xff09;類型。這些數據類型可以幫助我們根據需要選擇合適的類型來存儲數據。選擇合適的數據類型對于確保數據的完整性和性能至關重要。 以下…

RHEL8_Linux用rpm管理軟件

本章主要介紹使用rpm對軟件包進行管理 使用rpm查詢軟件的信息使用rpm安裝及卸載軟件使用rpm對軟件進行更新使用rpm對軟件進行驗證 rpm 全稱是redhat package manager&#xff0c;后來改成rpm package manager&#xff0c;這是根據源碼包編譯出來的包。先從光盤中拷貝一個包&am…

基于Java Swing泡泡龍游戲(Java畢業設計)

大家好&#xff0c;我是DeBug&#xff0c;很高興你能來閱讀&#xff01;作為一名熱愛編程的程序員&#xff0c;我希望通過這些教學筆記與大家分享我的編程經驗和知識。在這里&#xff0c;我將會結合實際項目經驗&#xff0c;分享編程技巧、最佳實踐以及解決問題的方法。無論你是…

AP9111手電筒專用集成電路芯片 單節干電池 LED手電筒IC

概述 AP9111 是 LED 手電筒專用集成電路芯片 &#xff0c;是一款采用大規模集成電路技術&#xff0c;專門針對單節干電池的 LED 手電筒設計的一款專用集成電路。外加 1 個電感元件&#xff0c;即可構成 LED 手電筒驅動電路板。AP 9111 性能優越、可靠性高、使用簡單、生產一致…

六級高頻詞匯3

目錄 單詞 參考鏈接 單詞 400. nonsense n. 胡說&#xff0c;冒失的行動 401. nuclear a. 核子的&#xff0c;核能的 402. nucleus n. 核 403. retail n. /v. /ad. 零售 404. retain vt. 保留&#xff0c;保持 405. restrict vt. 限制&#xff0c;約束 406. sponsor n. …

聊個開心的敏捷話題——40小時工作制

近年來&#xff0c;加班現象在很多行業已經普遍制度化&#xff0c;甚至“996”已成為一些行業標簽。企業高強度的壓榨讓員工不堪重負&#xff0c;且時常由此引發的各種悲劇也并不鮮見。 所以&#xff0c;今天我們一起來聊一個開心輕松的話題——極限編程的40h工作制原則。 40…

Leetcode(一)兩數之和

兩數之和 暴力 雙層循環 兩兩相加 等于目標值 返回 即可 class Solution {public int[] twoSum(int[] nums, int target) {for(int i0;i<nums.length;i){for(int j0;j<nums.length;j){if(nums[i]nums[j]target && i!j){int[] a{i,j};return a;}}}return null;…

kafka主題分區副本集群的概念

Kafka是一個高性能、分布式的消息系統&#xff0c;用于處理大規模的實時數據流。為了更好地理解Kafka的原理和使用&#xff0c;以下是Kafka中幾個重要概念的解釋&#xff1a; 主題&#xff08;Topic&#xff09;: Kafka中的最基本概念&#xff0c;相當于一個數據流或者消息流的…

【環境搭建】ubuntu22安裝ros2

基于某種特殊需求&#xff0c;從Ubuntu16到22目前都嘗試過安裝ros、ros2 參考1&#xff1a;http://t.csdnimg.cn/DzvSe 參考2&#xff1a;http://t.csdnimg.cn/sOzr1 1.設置locale sudo apt update && sudo apt install locales sudo locale-gen en_US en_US.UTF-8 s…

SQL注入漏洞檢測

預計更新SQL注入概述 1.1 SQL注入攻擊概述 1.2 SQL注入漏洞分類 1.3 SQL注入攻擊的危害 SQLMap介紹 2.1 SQLMap簡介 2.2 SQLMap安裝與配置 2.3 SQLMap基本用法 SQLMap進階使用 3.1 SQLMap高級用法 3.2 SQLMap配置文件詳解 3.3 SQLMap插件的使用 SQL注入漏洞檢測 4.1 SQL注入…

Spring的IOC容器初始化流程

Spring的IOC容器初始化流程 IOC容器初始化在SpringApplication對象創建完畢執行run方法時執行refreshContext()時開始。 準備BeanFactory&#xff0c;設置其類加載器和environment等 執行BeanFactory后置處理器&#xff0c;掃描要放入容器的Bean信息&#xff0c;得到對應的Bea…

計算機網絡常見的縮寫

計算機網絡常見縮寫 通訊控制處理機&#xff08;Communication Control Processor&#xff09;CCP 前端處理機&#xff08;Front End Processor&#xff09;FEP 開放系統互連參考模型 OSI/RM 開放數據庫連接&#xff08;Open Database Connectivity&#xff09;ODBC 網絡操作系…

阿里云服務器租用價格分享,阿里云服務器熱門配置最新活動價格匯總

在我們購買阿里云服務器的時候&#xff0c;1核2G、2核2G、2核4G、2核8G、4核8G、8核16G、8核32G等配置屬于用戶購買最多的熱門配置&#xff0c;1核2G、2核2G、2核4G這些配置低一點的云服務器基本上能夠滿足絕大部分個人建站和普通企業用戶建站需求&#xff0c;而4核8G、8核16G、…

Maven項目引入本地jar

Maven項目引入本地jar 1.對應maven模塊項目中建lib目錄&#xff0c;將jar放入進去 2.在對應的模塊pom.xml中引入此依賴jar 3.在對應的maven-plugin插件打包的pom.xml中指定需要includeSystemScope為true的jar

AMEYA360:大唐恩智浦榮獲 2023芯向亦莊 “汽車芯片50強”

2023年11月28日&#xff0c;由北京市科學技術委員會和北京市經濟和信息化局指導、北京經濟技術開發區管理委員會主辦、蓋世汽車協辦的“芯向亦莊”汽車芯片大賽在北京亦莊成功閉幕。 在本次大賽中 大唐恩智浦的 電池管理芯片DNB1168 (應用于新能源汽車BMS系統) 憑卓越的性能及高…

SQL注入一般過程

實驗&#xff1a;Vulnerability: SQL Injection&#xff08;low&#xff09; SQL注入一般過程 1.判斷注入點 一般和數據庫進行交互的位置 2.判斷注入點類型 字符型判斷&#xff1a; 1 報錯 1 and 12 錯誤結果 1 and 11 正確結果 數字型判斷&#xff1a; 1 報錯 1 and 12…

【SpringBoot教程】SpringBoot 實現前后端分離的跨域訪問(CORS)

作者簡介&#xff1a;大家好&#xff0c;我是擼代碼的羊駝&#xff0c;前阿里巴巴架構師&#xff0c;現某互聯網公司CTO 聯系v&#xff1a;sulny_ann&#xff08;17362204968&#xff09;&#xff0c;加我進群&#xff0c;大家一起學習&#xff0c;一起進步&#xff0c;一起對抗…

【畢業季|進擊的技術er】作為一名職場人,精心總結的嵌入式學習路線圖

活動地址&#xff1a;畢業季進擊的技術er 文章目錄 0、作者介紹1、前言2、嵌入式基礎必備知識2.1、學習內容2.2、學習建議2.3、學習資料 3、嵌入式入門篇——51單片機3.1、學習內容3.2、學習建議3.3、學習資料 4、STM32進階篇4.1、學習內容4.2、學習建議4.3、學習資料 5、小而美…