第一題?:
209.?長度最小的子數組
有上題可知,我們會采用雙指針和單調性的思路來解決
? ? ? ? 我們本題采用左右雙指針從數組的0位置同向前進,所以將此類模型稱為滑塊;
步驟思路如下:
步驟一:
? ? ? ? 定義所有雙指針都指向數組的0號位置;
步驟二:數組進窗口
? ? ? ? 右指針開始向右移動;
步驟三:判斷是否數組進窗口或者出窗口
? ? ? ? 當當前窗口中的數字sum小于t時,右指針繼續向右移動,直到數組之和大于等于t;
? ? ? ? 如上圖所示,當前的左指針向右移動,將左指針之前所指的元素退出窗口;
此時重復上述的操作,直到right指針到達數組的最右端;
同時我們每一次在判斷sum和要要求值之后都要更新len變量的結果
? ? ? ? 代碼如下所示:
class Solution {public int minSubArrayLen(int target, int[] nums) {int n = nums.length,sum = 0,lenght = Integer.MAX_VALUE;for(int left = 0,right = 0;right < n;right++){sum +=nums[right];while(sum >= target){lenght = Math.min(lenght,(right-left+1));sum -=nums[left];left ++;}}return lenght == Integer.MAX_VALUE ? 0:lenght;}
}
第二題:
3.?無重復字符的最長子串
如上題所示:
? ? ? ? 本題采用滑塊的相關知識點,如上題故事;
本題主要會采用如下的創新點:
?//把字符串變成字符數組,s1里面的每一個元素都是每一個字符的ascall值
? ? char[] s = ss.toCharArray();
//用數組模擬哈希表
//即用數組的下標為0的字符來表示ascall值為1 的數組。。。
//用數組里面的數字來表示該字符在hash值里面出現的次數
? ? int[] hash = new int[128];
用ascall值來映射數組中的字符,同時用數組來類似于hash表,當hash表中存放相應字符的出現次數,每次有相應的字符進入滑塊,該字符的出現次數加一,當該hash中相應的位置如果存放的數值大于一時,則滑塊中有重復的字符,應該采取進一步的措施;
解題步驟如下:
步驟一:
? ? ? ? 定義所有雙指針都指向數組的0號位置;
步驟二:數組進窗口
? ? ? ? 讓字符開始進入hash表;該數組存放的hash表的位置上數據+1;
判斷當右指針所指的hash表中數據>1時,我們要移動左指針,將之前進入到窗口里面的元素出去,同時hash表中的數據--;
? ? ? ? 同時每一次元素出窗口之后要更新窗口長度并記錄在案;
代碼如下所示:
class Solution {public int lengthOfLongestSubstring(String ss) {//把字符串變成字符數組,s1里面的每一個元素都是每一個字符的ascall值char[] s = ss.toCharArray();//用數組模擬哈希表//即用數組的下標為0的字符來表示ascall值為1 的數組。。。//用數組里面的數字來表示該字符在hash值里面出現的次數int[] hash = new int[128];int n = s.length;int res = 0;for(int left = 0,right = 0;right < n;){hash[s[right]] ++;while(hash[s[right]] > 1){hash[s[left]] --;left ++;res= Math.max(res,right-left+1); }res= Math.max(res,right-left+1);right++;} return res;}
}
ps:本次的內容就到這里了,如果對你有所幫助的話,就請一鍵三連哦,文章圖片是我喜歡的xox,在這里給大家安利一下哦!!!