深圳招聘一般在哪個網(wǎng)站aso優(yōu)化的主要內(nèi)容
第一題:長度最小的子數(shù)組
力扣(LeetCode)官網(wǎng) - 全球極客摯愛的技術(shù)成長平臺
思路:
第一想法肯定時暴力枚舉,枚舉數(shù)組任何一個元素,把他當(dāng)起始位置,然后從起始位置找最短區(qū)間,使得區(qū)間和大于等于目標(biāo)值
利用兩個嵌套for循環(huán),如果符合條件就記錄,然后更新結(jié)果,返回
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {// 記錄結(jié)果int ret = INT_MAX;int n = nums.size();// 枚舉出所有滿?和?于等于 target 的?數(shù)組[start, end]// 由于是取到最?,因此枚舉的過程中要盡量讓數(shù)組的?度最?// 枚舉開始位置for (int start = 0; start < n; start++){int sum = 0; // 記錄從這個位置開始的連續(xù)數(shù)組的和// 尋找結(jié)束位置for (int end = start; end < n; end++){sum += nums[end]; // 將當(dāng)前位置加上if (sum >= target) // 當(dāng)這段區(qū)間內(nèi)的和滿?條件時{// 更新結(jié)果,start 開頭的最短區(qū)間已經(jīng)找到ret = min(ret, end - start + 1);break;}}}// 返回最后結(jié)果return ret == INT_MAX ? 0 : ret;}
};
由于都是正數(shù)因此,只要找到最短區(qū)間就不必往下繼續(xù)查找,因為可能所有的數(shù)都不滿足條件,因此這里可能返回0,并且保證所有數(shù)都可更新,初始化ret為INT_MAX;
法二:滑動窗口
先將右端元素劃入窗口,然后統(tǒng)計窗口元素和,如果大于target,更新,并且把左端元素滑出,繼續(xù)同時判斷是否滿足更新結(jié)果,因為滑出去之和依舊可能滿足條件,如果窗口不滿足right++,進入下一個窗口。
?
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int n=nums.size(),sum=0,len=INT_MAX;for(int left=0,right=0;right<n;right++){sum+=nums[right];while(sum>=target){len=min(len,right-left+1);sum-=nums[left++];}}return len==INT_MAX?0:len;}
};
來自一個力扣大佬的形象解釋:左右指針中間窗口的sum為兩指針的“共同財產(chǎn)”,就是右指針一直在努力工作掙錢,好不容易共同財產(chǎn)大過target,記錄一下兩指針之間的距離,結(jié)果左指針就開始得瑟揮霍,不停花錢(往右移動),結(jié)果花錢一直花到sum又小過target,此時右指針不得不再次出來工作,不停向右移動,周而復(fù)始,最后取左右指針離得最近的時候
?
第二題:?重復(fù)字符的最??串(medium)
力扣(LeetCode)官網(wǎng) - 全球極客摯愛的技術(shù)成長平臺
法一依舊是暴力:
即先固定一個,然后遍歷所有,創(chuàng)建個哈希表用來記錄出現(xiàn)的次數(shù),如果大于一則說明出現(xiàn)重復(fù),那么就跳出當(dāng)前循環(huán),進入下一個固定的數(shù)進行遍歷,否則就記錄此刻長度
class Solution {
public:int lengthOfLongestSubstring(string s) {int ret = 0; // 記錄結(jié)果int n = s.length();// 1. 枚舉從不同位置開始的最?重復(fù)?串// 枚舉起始位置for (int i = 0; i < n; i++){// 創(chuàng)建?個哈希表,統(tǒng)計頻次int hash[128] = { 0 };// 尋找結(jié)束為?for (int j = i; j < n; j++){hash[s[j]]++; // 統(tǒng)計字符出現(xiàn)的頻次if (hash[s[j]] > 1) // 如果出現(xiàn)重復(fù)的break;// 如果沒有重復(fù),就更新 retret = max(ret, j - i + 1);}}// 2. 返回結(jié)果return ret;}
};
?
?法二:
例題中的 abcabcbb,進入這個隊列(窗口)為 abc 滿足題目要求,當(dāng)再進入 a,隊列變成了 abca,這時候不滿足要求。所以,我們要移動這個隊列!如何移動?我們只要把隊列的左邊的元素移出就行了,直到滿足題目要求!一直維持這樣的隊列,找出隊列出現(xiàn)最長的長度時候,求出解!
步驟就是右端ch元素進入時,用哈希表統(tǒng)計次數(shù),如果超過1,則有重復(fù),那么從左側(cè)滑出窗口,直到ch次數(shù)變?yōu)?,然后更新。
如果沒有超過1,說明沒有重復(fù),直接更新
class Solution {
public:int lengthOfLongestSubstring(string s){int hash[128]={0};int left=0,right=0,n=s.size();int ret=0;while(right<n){hash[s[right]]++;while(hash[s[right]]>1)//判斷進入{hash[s[left++]]--;//出窗口,然后左邊移動}ret = max(ret,right-left+1);right++;//}return ret;}
};
第三題:最大連續(xù)1的個數(shù)
力扣(LeetCode)官網(wǎng) - 全球極客摯愛的技術(shù)成長平臺
思路:這題,
class Solution
{
public:int longestOnes(vector<int>& nums, int k){int ret = 0;for (int left = 0, right = 0, zero = 0; right < nums.size(); right++){if (nums[right] == 0) zero++; // 進窗?while (zero > k) // 判斷if (nums[left++] == 0) zero--; // 出窗?ret = max(ret, right - left + 1); // 更新結(jié)果}return ret;}
}
?
?
?