知è˜
ä¸ç®¡æ˜¯ç¶²(wÇŽng)站,軟件還是å°ç¨‹åºï¼Œéƒ½è¦ç›´æŽ¥æˆ–間接能為您產(chÇŽn)生價(jià )值,我們在追求其視覺表ç¾(xià n)çš„åŒæ™‚(shÃ),更å´(cè)é‡äºŽåŠŸèƒ½çš„ä¾¿æ·ï¼Œç‡ŸéŠ·çš„ä¾¿åˆ©ï¼Œé‹(yùn)營的高效,讓網(wÇŽng)ç«™æˆç‚ºç‡ŸéŠ·å·¥å…·ï¼Œè®“è»Ÿä»¶èƒ½åˆ‡å¯¦(shÃ)æå‡ä¼æ¥(yè)å…§(nèi)éƒ¨ç®¡ç†æ°´å¹³å’Œæ•ˆçŽ‡ã€‚å„ª(yÅu)秀的程åº?yà n)楹笃è°î¥å£§å³â”憬莸闹С郑?
您當(dÄng)å‰ä½ç½®>é¦–é » æ–°èžè³‡è¨Š » 技術(shù)分享 >
ã€leetcode】è¢å»šç²¾é¸é¡Œç¸½çµ(jié)之什么時(shÃ)候用雙指é‡ï¼Œè©²å’‹ç”¨ï¼Ÿ
發(fÄ)表時(shÃ)間:2020-10-18
發(fÄ)布人:葵宇科技
ç€è¦½æ¬¡æ•¸(shù):62
那些å¯ä»¥ç”¨é›™æŒ‡é‡è§£æ±ºçš„題目
- 什么時(shÃ)候用雙指é‡,該咋用?
- 雙指é‡?biÄo)æž·?/li>
- 35.æœç´¢æ’å…¥ä½ç½®
- 27.移除元ç´
- 209,長度最å°çš„åæ•¸(shù)組
什么時(shÃ)候用雙指é‡,該咋用?
雙指é‡?biÄo)æž·?/h2>
é›™æŒ‡é‡æ˜¯æˆ‘們åšé¡Œä¸ç¶“(jÄ«ng)å¸¸ç”¨åˆ°çš„æ€æƒ³,所以這個(gè)åœ¨åˆ·é¡ŒåˆæœŸæ˜¯ä¸€å®šè¦æœƒ(huì)的。其實(shÃ)我們早就å¸(xué)ç¿’(xÃ)éŽé€™å€‹(gè)方法,我們通éŽäºŒåˆ†æŸ¥æ‰¾ä¾†æè¿°ä¸€ä¸‹é€™å€‹(gè)æ€æƒ³ã€‚
二分查找首先定義兩個(gè)指é‡,左指é‡å’Œå³æŒ‡é‡,åˆ†åˆ¥æŒ‡å‘æ•¸(shù)組的é 和尾,ç„¶åŽè¨ˆ(jì)算出他倆的ä¸é–“的索引,其值和目標(biÄo)值進(jìn)行比較,如果目標(biÄo)值更大則說明目標(biÄo)值在ä¸é–“ç´¢å¼•å’Œå³æŒ‡é‡ä¸é–“,則需è¦ç§»å‹•(dòng)左指é‡åˆ°ä¸é–“索引的åŽä¸€ä½ã€‚如果目標(biÄo)值比ä¸é–“值å°,則需è¦ç§»å‹•(dòng)峿Œ‡é‡åˆ°ä¸é–“索引的å‰ä¸€ä½ã€‚䏿–·åŸ·(zhÃ)行,直至找到目標(biÄo)值,或當(dÄng)該數(shù)組ä¸å«æœ‰ç›®æ¨™(biÄo)值,左指é‡å’Œå³æŒ‡é‡é‡åˆæ™‚(shÃ)跳出該循環(huán)。
二分查找代碼
public static int halfnum(int[] arraynum ,int b){
int hi =arraynum.length-1;
int lo = 0;
//先判斷數(shù)çµ„æ˜¯ä¸æ˜¯ç©º
if (arraynum.length==0){
return -1;
}
while(hi>=lo){
//判斷是å¦ç‰äºŽè¦çŒœçš„æ•¸(shù)
if(b==arraynum[(hi+lo)/2]){
return (hi+lo)/2;
}
//大于ä¸é–“數(shù)的情æ³
else if (b>arraynum[(hi+lo)/2]){
lo= (hi+lo)/2+1;
}
//å°äºŽä¸é–“數(shù)的情æ³
else{
hi=(hi+lo)/2-1;
}
}
return -1;
}
35.æœç´¢æ’å…¥ä½ç½®
給定一個(gè)æŽ’åºæ•¸(shù)組和一個(gè)目標(biÄo)值,在數(shù)çµ„ä¸æ‰¾åˆ°ç›®æ¨™(biÄo)值,并返回其索引。如果目標(biÄo)值ä¸å˜åœ¨äºŽæ•¸(shù)組ä¸,返回它將會(huì)è¢«æŒ‰é †åºæ’入的ä½ç½®ã€‚ä½ å¯ä»¥å‡è¨(shè)數(shù)組ä¸ç„¡é‡å¾©(fù)å…ƒç´ ã€‚
示例 1:
輸入: [1,3,5,6], 5
輸出: 2
示例 2:
輸入: [1,3,5,6], 2
輸出: 1
示例 3:
輸入: [1,3,5,6], 7
輸出: 4
示例 4:
輸入: [1,3,5,6], 0
輸出: 0
題目很好ç†è§£,但是我們想è¦ä¸€æ¬¡AC是ä¸å¤ªå®¹æ˜“çš„ã€‚æˆ‘å€‘æ ¹æ“š(jù)題æ„å¯ä»¥æƒ³åˆ°,這樣共有四種å¯èƒ½
æ’入情æ³ç„¡éžå°±é€™å¹¾ç¨®
(1)比數(shù)組里的任何值都å°,æ’å…¥é 部
(2)比數(shù)組里的任何值都大,æ’入尾部
(3)查詢到數(shù)çµ„å…ƒç´ ,返回該處索引值
(4)數(shù)組內(nèi)ç„¡è©²å…ƒç´ ,將其æ’å…¥å…©å…ƒç´ ä¹‹é–“ã€‚
所以我們å¯ä»¥é€šéŽä»¥ä¸‹ä»£ç¢¼å¯¦(shÃ)ç¾(xià n)該題
class Solution {
public int searchInsert(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while(left <= right) {
//ä¸é–“值,與targetå°æ¯”
int mid = (left + right) / 2;
//第三種情æ³
if(nums[mid] == target) {
return mid;
//移動(dòng)左指é‡
} else if(nums[mid] < target) {
left = mid + 1;
} else {
//移動(dòng)峿Œ‡é‡
right = mid - 1;
}
}
//1,2,4三種情æ³éƒ½åœ¨å¾ªç’°(huán)å…§(nèi)部,我們åªéœ€è¼¸å‡ºå·¦æŒ‡é‡å³å¯ã€‚
return left;
}
}
å‰›æ‰æˆ‘們說了雙指é‡?biÄo)枷氲闹匾?#xff0c;下é¢é€™å€‹(gè)題目也是å¯ä»¥å®Œå…¨é€šéŽé›™æŒ‡é‡?biÄo)枷雽?shÃ)ç¾(xià n)çš„,所以說雙指é‡çš„æ€æƒ³æ˜¯å¿…é ˆæœ‰çš„ã€‚ä½ å¯ä»¥é€šéŽä¸‹é¢é€™å€‹(gè)題目完全體會(huì)到雙指é‡çš„é‡è¦æ€§
27.移除元ç´
çµ¦ä½ ä¸€å€‹(gè)數(shù)組 nums 和一個(gè)值 val,ä½ éœ€è¦ åŽŸåœ° 移除所有數(shù)值ç‰äºŽ val çš„å…ƒç´ ,å¹¶è¿”å›žç§»é™¤åŽæ•¸(shù)組的新長度。
ä¸è¦ä½¿ç”¨é¡å¤–的數(shù)組空間,ä½ å¿…é ˆåƒ…ä½¿ç”¨ O(1) é¡å¤–空間并 原地 修改輸入數(shù)組。
å…ƒç´ çš„é †åºå¯ä»¥æ”¹è®Šã€‚ä½ ä¸éœ€è¦è€ƒæ…®æ•¸(shù)組ä¸è¶…出新長度åŽé¢çš„å…ƒç´ ã€‚
示例 1:
給定 nums = [3,2,2,3], val = 3,
函數(shù)應(yÄ«ng)該返回新的長度 2, 并且 nums ä¸çš„å‰å…©å€‹(gè)å…ƒç´ å‡ç‚º 2。
ä½ ä¸éœ€è¦è€ƒæ…®æ•¸(shù)組ä¸è¶…出新長度åŽé¢çš„å…ƒç´ ã€‚
示例 2:
給定 nums = [0,1,2,2,3,0,4,2], val = 2,
函數(shù)應(yÄ«ng)該返回新的長度 5, 并且 nums ä¸çš„å‰äº”個(gè)å…ƒç´ ç‚º 0, 1, 3, 0, 4。
注æ„這五個(gè)å…ƒç´ å¯ç‚ºä»»æ„é †åºã€‚
ä½ ä¸éœ€è¦è€ƒæ…®æ•¸(shù)組ä¸è¶…出新長度åŽé¢çš„å…ƒç´ ã€‚
該題目我們å¯ä»¥å‰µ(chuà ng)建兩個(gè)指é‡,一å‰ä¸€åŽ,å‰é¢çš„è² (fù)責(zé)探路åŽé¢çš„è² (fù)責(zé)å¡«å……,ç•¶(dÄng)å‰é¢æŸ¥è©¢åˆ°éœ€è¦ç§»é™¤çš„å…ƒç´ æ™‚(shÃ)直接跳éŽè©²å…ƒç´ ,繼續(xù)å‰é€²(jìn)。åŽé¢çš„æŒ‡é‡åªè² (fù)責(zé)往該數(shù)組里é¢å¡«å……ä¸éœ€è¦ç§»é™¤çš„æ•¸(shù)å—。所以我們å¯ä»¥æ ¹æ“š(jù)以下代碼實(shÃ)ç¾(xià n)
class Solution {
public int removeElement(int[] nums, int val) {
//特殊情æ³
if(nums==null){
return 0;
}
int j = 0;//慢指é‡,i代表快指é‡
for(int i = 0;i<nums.length;i++){
//æ£å¸¸æƒ…æ³ç›´æŽ¥è³¦å€¼çµ¦i
if(nums[i]!=val){
nums[j]=nums[i];
j++;
}
//如果為需è¦?jiÇŽng)h除的值時(shÃ),則快指é‡ç§»å‹•(dòng),慢指é‡ä¸å‹•(dòng)。
}
return j;
}
}
å‰›æ‰æˆ‘們å¸(xué)ç¿’(xÃ)了兩個(gè)雙指é‡çš„題目,æ˜¯ä¸æ˜¯å°é€™å€‹(gè)åšé¡Œæ€æƒ³æœ‰äº†ä¸€äº›ç†è§£äº†,䏋颿ˆ‘們來使用一個(gè)æ›´åŠ é«˜ç´šçš„é›™æŒ‡é‡,這個(gè)也是經(jÄ«ng)å¸¸ä½¿ç”¨çš„æ€æƒ³,ä½†æ˜¯æ¸æ ¹çµ(jié)底還是雙指é‡?biÄo)æž·æ¿?/p>
è©²é¡Œç›®çš„æ€æƒ³ä¹Ÿæ˜¯é›™æŒ‡é‡çš„æ€æƒ³,ä¸éŽé€™å€‹(gè)代碼比較難寫一些,用到的情æ³ä¹Ÿæ˜¯æ¯”較多的,所以我們這個(gè)題目è¦ç”¨å¿ƒé«”會(huì)一下。
209,長度最å°çš„åæ•¸(shù)組
給定一個(gè)嫿œ‰ n 個(gè)æ£æ•´æ•¸(shù)的數(shù)組和一個(gè)æ£æ•´æ•¸(shù) s ,找出該數(shù)çµ„ä¸æ»¿è¶³å…¶å’Œ ≥ s 的長度最å°çš„ 連續(xù) åæ•¸(shù)組,并返回其長度。如果ä¸å˜åœ¨ç¬¦åˆæ¢ä»¶çš„åæ•¸(shù)組,返回 0。
示例:
輸入:s = 7, nums = [2,3,1,2,4,3]
輸出:2
解釋:åæ•¸(shù)組 [4,3] 是該æ¢ä»¶ä¸‹çš„長度最å°çš„åæ•¸(shù)組
題目å«ç¾©æ¯”較好ç†è§£,則是在數(shù)çµ„é‡Œé¢æ‰¾å‡ºé•·åº¦æœ€å°çš„åæ•¸(shù)組,åæ•¸(shù)çµ„çš„å…ƒç´ å’Œå¤§äºŽç‰äºŽç›®æ¨™(biÄo)值。這個(gè)題目我們就用到了滑動(dòng)窗å£çš„æ€æƒ³ã€‚
滑動(dòng)窗å£:就是通éŽä¸æ–·èª¿(dià o)節(jié)åæ•¸(shù)組的起始ä½ç½®å’Œçµ‚æ¢ä½ç½®,進(jìn)而得到我們想è¦çš„çµ(jié)果我們也å¯ä»¥çœ‹æˆæ˜¯é›™æŒ‡é‡çš„一種。
在該題ä¸,我們å¯èƒ½é‡åˆ°é€™ç¨®æƒ…æ³ å¤§å®¶æ€è€ƒä¸€ä¸‹,數(shù)組的值是1,2,3,4,5我們的s為5,æ‰€ä»¥æˆ‘å€‘ç¬¬ä¸€æ¬¡çš„åæ•¸(shù)組(滑動(dòng)窗å£)長度則為3,1+2+3>5,這時(shÃ)左指é‡åœ¨1çš„ä½ç½®,峿Œ‡é‡åœ¨3çš„ä½ç½®,但是2+3=5åŒæ¨£ç¬¦åˆ,所以我們就需è¦ç§»å‹•(dòng)左指é‡,æ¤æ™‚(shÃ)窗å£é•·åº¦å‰‡æ”¹ç‚º2äº†ã€‚ç„¶åŽæˆ‘們ä¿ç•™è©²å€¼,繼續(xù)移動(dòng)左指é‡,判斷3是å¦ä»ç¬¦åˆ,æ¤æ™‚(shÃ)發(fÄ)ç¾(xià n)ä¸ç¬¦åˆäº†,則需è¦ç§»å‹•(dòng)峿Œ‡é‡,移動(dòng)到下一個(gè)ç¬¦åˆæƒ…æ³çš„å…ƒç´ ,繼續(xù)執(zhÃ)行剛æ‰çš„æ¥é©Ÿ,直到數(shù)組的最åŽã€‚所以整個(gè)éŽç¨‹ä¸æ»‘å‹•(dòng)窗å£çš„長度變化為,3,2,3,2,3,2,1,最å°çš„則為1.
我們å¯ä»¥é€šéŽä»¥ä¸‹ä»£ç¢¼è§£æ±ºè©²é¡Œã€‚
class Solution {
public int minSubArrayLen(int s, int[] nums) {
int chiledlen = Integer.MAX_VALUE;
int winlen = 0;//窗å£å¤§å°
int sum = 0;
int i = 0;//起始長度ä½ç½®
for(int j = 0 ; j < nums.length;j++){
sum += nums[j];
//發(fÄ)ç¾(xià n)ç¬¦åˆæ¢ä»¶çš„æƒ…æ³
//循環(huán)內(nèi)部的代碼是精髓所在
while(sum>=s){
winlen = j-i+1;
chiledlen = Math.min(chiledlen,winlen);
//下é¢å…©è¡Œæ˜¯æ»‘å‹•(dòng)窗å£çš„æ„ç¾©æ‰€åœ¨,改變起點(diÇŽn)ä½ç½®,判斷是å¦ä»ç¬¦åˆæ¢ä»¶
sum-=nums[i];
i++;
}
}
return chiledlen == Integer.MAX_VALUE ? 0:chiledlen;
}
}
通éŽä»¥ä¸Šä¸‰å€‹(gè)é¡Œç›®æˆ‘å€‘æ˜¯ä¸æ˜¯å°é›™æŒ‡é‡?biÄo)枷胗辛艘æâ”œæ–«é¥¬?#xff0c;è©²æ€æƒ³ä¸åƒ…å¯ä»¥ç”¨åœ¨æ•¸(shù)組的題目上,éˆè¡¨åŒæ¨£é©ç”¨ã€‚所以我們è¦å®Œå…¨æŽŒæ¡,這三個(gè)題目大家有時(shÃ)間的話還是自己動(dòng)手åšä¸€ä¸‹ã€‚
相關(guÄn)案例查看更多
相關(guÄn)閱讀
- 楚雄網(wÇŽng)站建è¨(shè)å…¬å¸
- APP
- 云å—微信å°ç¨‹åºé–‹ç™¼(fÄ)
- ç¶²(wÇŽng)站建è¨(shè)快速優(yÅu)化
- å°ç¨‹åºé–‹ç™¼(fÄ)課程
- å°ç¨‹åºé–‹ç™¼(fÄ)è¯(lián)系方å¼
- 微分銷
- 云å—ç¶²(wÇŽng)絡(luò)營銷顧å•
- å°ç¨‹åºå®šåˆ¶
- 排å
- 云å—ç¶²(wÇŽng)é 制作
- ç¶²(wÇŽng)站建è¨(shè)首é¸
- å°ç¨‹åºç”¨æˆ¶ç™»éŒ„
- ç¶²(wÇŽng)絡(luò)å…¬å¸è¯(lián)系方å¼
- ç¶²(wÇŽng)站建è¨(shè)哪家強(qiáng)
- ç¶²(wÇŽng)站建è¨(shè)å…¬å¸ç¶²(wÇŽng)ç«™
- å ±(bà o)廢車回收
- 云å—ç¶²(wÇŽng)站制作
- 表單
- 云å—åšè»Ÿä»¶
- 云å—çœå»ºè¨(shè)廳官方網(wÇŽng)ç«™
- ç¶²(wÇŽng)站建è¨(shè)
- å°ç¨‹åºç”Ÿæˆæµ·å ±(bà o)
- 云å—etc微信å°ç¨‹åº
- 昆明網(wÇŽng)站開發(fÄ)
- 云å—ç¶²(wÇŽng)站建è¨(shè)案例
- äººå£æ™®æŸ¥å°ç¨‹åº
- ç¶²(wÇŽng)站建è¨(shè)å…¬å¸åœ°å€
- ç¶²(wÇŽng)站優(yÅu)化公å¸
- å°ç¨‹åºæ¨¡æ¿é–‹ç™¼(fÄ)å…¬å¸