977.有序數(shù)組的平方
思考過(guò)程:
題目說(shuō)非遞減順序,意思是遞增但是可能有相同的數(shù)。
題目要求包括兩個(gè)部分:1.計(jì)算平方,覆蓋之前的內(nèi)容,2.排序。
要完成計(jì)算平方很簡(jiǎn)單,一個(gè)for循環(huán)就可以。
排序用兩個(gè)for循環(huán)?昨天的兩個(gè)for轉(zhuǎn)變?yōu)橐粋€(gè)for是將原先的內(nèi)容直接覆蓋,今天的是不是用一個(gè)中間值,多一步對(duì)比也能實(shí)現(xiàn)?
讀第二遍題目發(fā)現(xiàn):既然是按照非遞減排列的,那么如果前端值是負(fù)數(shù),一定比下一個(gè)數(shù)大,也就是說(shuō),找到絕對(duì)值的最小值,先給他們排個(gè)序再平方。
emmmm也需要排序,這樣復(fù)雜度好像沒(méi)變化。
先寫(xiě)一寫(xiě)吧
寫(xiě)著寫(xiě)著發(fā)現(xiàn)排序并不需要2個(gè)for,只需要交換相鄰數(shù)就好
好了不行,這樣不能保證前面的數(shù)排序正確,好家伙,我連最簡(jiǎn)單的冒泡都忘了嗎?
看代碼隨想錄
原來(lái)C++有專門的排序函數(shù)....
這個(gè)雙指針的方法好巧妙??!我最開(kāi)始剛還想過(guò)雙指針,但是沒(méi)有運(yùn)用的特別靈活
理清這個(gè)思路之后其實(shí)問(wèn)題關(guān)鍵點(diǎn)還是在邊界上
第一版,樣例AC,但是中間測(cè)試數(shù)據(jù)出現(xiàn)執(zhí)行出錯(cuò),說(shuō)明邊界存在問(wèn)題
class?Solution?{
public:
????vector<int>?sortedSquares(vector<int>&?nums)?{
????????int?lens?=?nums.size();
????????vector<int>?result(lens,?0);
????????int?left?=?0,?right?=?lens?-?1;
????????while(left?<?right){
????????????if(abs(nums[left])?>?abs(nums[right])){
????????????????result[lens-1]?=?nums[left]?*?nums[left];
????????????????left?=?left?+?1;
????????????????lens--;
????????????}
????????????else?if(abs(nums[left])?<?abs(nums[right])){
????????????????result[lens-1]?=?nums[right]?*?nums[right];
????????????????right?=?right?-?1;
????????????????lens--;
????????????}
????????????else{
????????????????result[lens-1]?=?nums[left]?*?nums[left];
????????????????lens--;
????????????????result[lens-1]?=?nums[right]?*?nums[right];
????????????????lens--;
????????????}
????????}
????????result[0]?=?nums[right]?*?nums[right];
????????return?result;
????}
};
第二版,所有測(cè)試用例都AC了,不如代碼隨想錄簡(jiǎn)單,等二刷自增自減使用更熟練再改改
class?Solution?{
public:
????vector<int>?sortedSquares(vector<int>&?nums)?{
????????int?lens?=?nums.size();
????????vector<int>?result(lens,?0);
????????int?left?=?0,?right?=?lens?-?1;
????????while(left?<=?right){
????????????if(abs(nums[left])?>?abs(nums[right])){
????????????????result[lens-1]?=?nums[left]?*?nums[left];
????????????????left?=?left?+?1;
????????????????lens--;
????????????}
????????????else?{
????????????????result[lens-1]?=?nums[right]?*?nums[right];
????????????????right?=?right?-?1;
????????????????lens--;
????????????}
????????}
????????return?result;
????}
};
209.長(zhǎng)度最小的子數(shù)組
思考過(guò)程:
遞歸肯定是可以實(shí)現(xiàn)的。思考一下簡(jiǎn)單方法。
要想長(zhǎng)度最小,就要找到數(shù)組里面的最大值,再向左向右雙指針?lè)謩e計(jì)算,最終得到最小數(shù),寫(xiě)一下。
寫(xiě)的中間遇到問(wèn)題:
1.如果說(shuō)兩邊不一樣長(zhǎng),如何檢測(cè)到right到頭了,但是left還可以繼續(xù)加呢??
2.如果是橫跨最大值的一個(gè)數(shù)組呢?
這個(gè)思路行不通
看代碼隨想錄
卡哥使用的滑動(dòng)窗口實(shí)現(xiàn)的。
實(shí)驗(yàn)室馬上關(guān)門了,我先做下一道,回去之后再詳細(xì)看,明天更新~
59.螺旋矩陣II
矩陣問(wèn)題首先判斷有幾行幾列,顯然結(jié)果是n行n列。
螺旋矩陣賦值最簡(jiǎn)單的是用兩個(gè)for,但是肯定可以用雙指針解決,嘻嘻我已經(jīng)熟啦,讓我試著寫(xiě)一下。
寫(xiě)著寫(xiě)著...對(duì)不起,我不熟....思考很簡(jiǎn)單,但是真正寫(xiě)代碼判斷限制條件的時(shí)候還是會(huì)出問(wèn)題
看代碼隨想錄
明天更明天更,要回宿舍了
總結(jié)
1.對(duì)雙指針的使用不夠靈活
2.