刷題記錄(初級算法-數(shù)組篇)

最近開始認(rèn)真刷題了鸟缕,反正做了些題目就記錄一些吧鸭限,這里記錄了LeetCode初級算法中數(shù)組的一些題目:

加一

本來想先轉(zhuǎn)成整數(shù),加1后再轉(zhuǎn)回去析桥;耽美想到測試的例子考慮到了這個方法的笨重司草,所以int類型超了最大范圍65536,導(dǎo)致程序出錯泡仗。

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        int m=digits.size();
        int old=0;
        for(int i=0;i<m;i++)
        {
            old=old*10+digits[i];
        }
        
        int re=old+1;
        vector<int> a;
        while(re!=0)
        {
            a.insert(a.begin(),re%10);
            re=re/10;
        }
        
        return a;
    }
};

下面完全是從數(shù)組的角度進(jìn)行的思考:分析了各種情況綜合得出代碼:

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        int m=digits.size();
        if(m==1&&digits[0]==0) {digits[0]+=1;return digits;}
        for(int i=m-1;i>=0;i--)
        {
            if(digits[i]==9) digits[i]=0;
            else {digits[i]+=1;return digits;}
        }
        
        if(digits.front()==0) digits.insert(digits.begin(),1);
        return digits;
    }
};

此外還有一種解法:
這種方法就很機(jī)智的將進(jìn)位carry這個思路加了進(jìn)來埋虹,如果carry=0的話就說明暫時沒有進(jìn)位,可以直接返回沮焕;如果有進(jìn)位的話繼續(xù)操作吨岭。最后在循環(huán)結(jié)束后,如果還有進(jìn)位峦树,說明要加1辣辫,用和前一個解法的insert就可以了。

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        if (digits.empty()) return digits;
        int carry = 1, n = digits.size();
        for (int i = n - 1; i >= 0; --i) {
            if (carry == 0) return digits;
            int sum = digits[i] + carry;
            digits[i] = sum % 10;
            carry = sum / 10;
        }
        if (carry == 1) digits.insert(digits.begin(), 1);
        return digits;
    }
};

從排序數(shù)組中刪除重復(fù)項

下面是我最初始的想法魁巩,通過循環(huán)急灭,遍歷的這一項等于前一項的話,就通過迭代器iterator it將這一項清除掉谷遂,如果不相等就將count加1葬馋;這樣覺得很完美,但是實際上每次將這一項清除掉的時候,vector的總長度就發(fā)生變化了畴嘶,所以會導(dǎo)致出錯5坝狻!窗悯!下面是錯誤代碼:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int count=1;
        if(nums.size()==0) return 0;
        if(nums.size()==1) return 1;
        for(int i=1;i<nums.size();i++)
        {
            if(nums[i]==nums[i-1]) 
            {
              std::vector<int>::iterator it=nums.begin()+i-1;
              nums.erase(it);
            }
            else count++;
        }
        
        return count;
    }
};

更換思路区匣,發(fā)現(xiàn)題目中有這樣的一句話:不需要理會新的數(shù)組長度后面的元素;這叫告訴我們蒋院,可以把不需要的元素弄到后面去或者將我們需要的元素弄到前面來亏钩,所以有了下面的解法:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int m=nums.size();
        if(m==0) return 0;
        if(m==1) return 1;
        int count=0;
        for(int i=1;i<m;i++)
        {
        if(nums[i]!=nums[count])
            nums[++count]=nums[i];
        }
        return count+1;  
    }
};

只出現(xiàn)一次的數(shù)字

#include <algorithm>
using namespace std;
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        if(nums.size()==0) return 0;
        if(nums.size()==1) return nums[0];
        int m=nums.size();
        sort(nums.begin(),nums.end());
        for(int i=1;i<nums.size();i=i+2)
        {
           if(nums[i]!=nums[i-1]) return nums[i-1]; 
        }
        return nums[m-1];
            
             }
// private:
//     bool compare(int a,int b)
//              {
//                  return a<b;
//              }
             
};

移動零

典型的雙指針的應(yīng)用!欺旧!

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int fast=0,slow=0;
        int m=nums.size();
        while(fast<m)
        {
            if(nums[fast]!=0)
            {
                nums[slow]=nums[fast];
                slow++;
            }
            fast++;
        }
        
        for(int i=slow;i<m;i++)
            nums[i]=0;
    }
};

兩個數(shù)組的交集

首先就想到兩個for循環(huán)姑丑,然后在新創(chuàng)建的vector中進(jìn)行排序、去重辞友,輸出即可:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        //sort(nums1.begin(),nums1.end());
        //sort(nums2.begin(),nums2.end());
        
        vector<int> c;
        if(nums1.size()==0||nums2.size()==0) return c;
        for(int i=0;i<nums1.size();i++)
        {
            for(int j=0;j<nums2.size();j++)
            {
                if(nums1[i]==nums2[j])
                    c.push_back(nums1[i]);
            }
        }
        
     sort(c.begin(), c.end());
     vector<int>::iterator iter = unique(c.begin(), c.end());
     c.erase(iter, c.end());
     return c;
    }
};

這里說一下如何對vector進(jìn)行去重栅哀,想到的方法有兩個:利用set或者unique(),其中unique()函數(shù)是這樣的踏枣,

sort (a, a + n);  
vector<int>v (a, a + n);  
vector<int>::iterator it = unique(v.begin(), v.end() );  
v.erase (it, v.end() );//這里就是把后面藏起來的重復(fù)元素刪除了 

而set則更為簡單昌屉,設(shè)置一個set,再將vector的數(shù)據(jù)重新傳入set中茵瀑,時間復(fù)雜度較小而且較方便间驮。
然后,看了看大神的代碼马昨,他直接用了set的取集合交集set_intersection竞帽,代碼如下:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
    set<int> s1(nums1.begin(),nums1.end()),s2(nums2.begin(),nums2.end()),res;
    set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(),inserter(res,res.begin()));
    return vector<int>(res.begin(),res.end());
    }
    };

更多關(guān)于set的用法可以參看這一篇博客

兩個數(shù)組的交集2

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        vector<int> c;
        if(nums1.size()==0||nums2.size()==0) return c;
        sort(nums1.begin(),nums1.end());
        sort(nums2.begin(),nums2.end());
        int i=0,j=0;
        while(i<nums1.size()&&j<nums2.size())
        {
            if(nums1[i]==nums2[j])
            {
                c.push_back(nums1[i]);
                i++;j++;
            }
            else if(nums1[i]>nums2[j])
                j++;
            else
                i++;
        }
        return c;
    }
};

ValidSudoku

這道題真的挺有意思,但因為不用判斷數(shù)獨(dú)是否有解鸿捧,所以降低了很多難度屹篓。基本思路是這樣的匙奴,針對每一行每一列判斷是否有重復(fù)的數(shù)字堆巧,然后在針對每個九宮格進(jìn)行判斷。而判斷是否重復(fù)的方法挺巧妙的泼菌,就是利用數(shù)組小表的唯一性谍肤。a[nums]初始值為0,出現(xiàn)過一次數(shù)字后變?yōu)?哗伯,nums是由所填數(shù)字的下表來決定的荒揣,舉個例子就會清楚了:假如第一行里有兩個7,nums[7】初始值為0焊刹,在第一次7的時候nums[7]變?yōu)榱?系任,在第二次遇到7的時候由于之前已經(jīng)變?yōu)榱?恳蹲,簡單的判斷語句就能發(fā)現(xiàn)這里實際上出現(xiàn)了問題。下面貼上代碼:

class Solution {  
public:  
    bool isValidSudoku(vector<vector<char>>& board) {  
        int i,j,k,l,map[10];  
        if(board.size()!=9 || board[0].size()!=9)return false;  
        for(i=0;i<9;i++){  
            memset(map,0,sizeof(map));  
            for(j=0;j<9;j++){  
                if(board[i][j]=='.')continue;  
                if(board[i][j]<'0' || board[i][j]>'9')return false;  
                int num=board[i][j]-'0';  
                if(map[num])return false;  
                map[num]=1;  
            }  
        }  
        for(j=0;j<9;j++){  
            memset(map,0,sizeof(map));  
            for(i=0;i<9;i++){  
                if(board[i][j]=='.')continue;  
                int num=board[i][j]-'0';  
                if(map[num])return false;  
                map[num]=1;  
            }  
        }  
        for(i=0;i<9;i+=3){  
            for(j=0;j<9;j+=3){  
                memset(map,0,sizeof(map));  
                for(k=i;k<i+3;k++){  
                    for(l=j;l<j+3;l++){  
                        if(board[k][l]=='.')continue;  
                        int num=board[k][l]-'0';  
                        if(map[num])return false;  
                        map[num]=1;  
                    }  
                }  
            }  
        }  
        return true;  
    }  
}; 

旋轉(zhuǎn)圖像

這道題我感覺比較奇怪俩滥,思路比較好像用的是reverse與swap嘉蕾,我看了別人的代碼只是先后順序不同而已,但是自己的代碼(注釋掉的)卻在輸入為44矩陣時不能執(zhí)行reverse霜旧,而自己在私下測試了reverse確實是可以將44矩陣執(zhí)行reverse操作的荆针,自己的想法是先將行數(shù)倒置,然后沿著主對角線進(jìn)行swap()操作颁糟,得到最終結(jié)果。而我最終的代碼喉悴,是先交換在倒置棱貌,我認(rèn)為先后順序是沒有問題的,但是程序卻沒有執(zhí)行reverse的操作箕肃,就很奇怪婚脱。

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        /*
        for(int i=0;i<matrix.size();i++)
            reverse(matrix.begin(),matrix.end());
        
        for(int i=0;i<matrix[0].size();i++)
        {
            for(int j=i+1;j<matrix.size();j++)
            {
              swap(matrix[i][j],matrix[j][i]) ;
            } 
        }*/
        
        int n = matrix.size();
        for (int i = 0; i < n; ++i) {
            for (int j = i + 1; j < n; ++j) {
                swap(matrix[i][j], matrix[j][i]);
            }
            reverse(matrix[i].begin(), matrix[i].end());
        }
    }
};

買賣股票的最佳時機(jī)2

股票衡量是否為利潤是基于前一天的價格和今天的價格來比較的,知道這個就好做了勺像。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
      int l = prices.size();
        if(l <= 0) {
            return 0;
        }

        int max = 0;
        for(int i=1; i<l; i++) {
            if(prices[i] - prices[i-1] > 0) {
                max += (prices[i] - prices[i-1]);
            }
        }
        return max;
    }  
    
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末障贸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吟宦,更是在濱河造成了極大的恐慌篮洁,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件殃姓,死亡現(xiàn)場離奇詭異袁波,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蜗侈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門篷牌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人踏幻,你說我怎么就攤上這事枷颊。” “怎么了该面?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵夭苗,是天一觀的道長。 經(jīng)常有香客問我吆倦,道長听诸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任蚕泽,我火速辦了婚禮晌梨,結(jié)果婚禮上桥嗤,老公的妹妹穿的比我還像新娘。我一直安慰自己仔蝌,他們只是感情好泛领,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著敛惊,像睡著了一般渊鞋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瞧挤,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天锡宋,我揣著相機(jī)與錄音,去河邊找鬼特恬。 笑死执俩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的癌刽。 我是一名探鬼主播役首,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼显拜!你這毒婦竟也來了衡奥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤远荠,失蹤者是張志新(化名)和其女友劉穎矮固,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體矮台,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乏屯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瘦赫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辰晕。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖确虱,靈堂內(nèi)的尸體忽然破棺而出含友,到底是詐尸還是另有隱情,我是刑警寧澤校辩,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布窘问,位于F島的核電站,受9級特大地震影響宜咒,放射性物質(zhì)發(fā)生泄漏惠赫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一故黑、第九天 我趴在偏房一處隱蔽的房頂上張望儿咱。 院中可真熱鬧庭砍,春花似錦、人聲如沸混埠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钳宪。三九已至揭北,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吏颖,已是汗流浹背搔体。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留半醉,地道東北人嫉柴。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像奉呛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子夯尽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗瞧壮。 張土汪:刷leetcod...
    土汪閱讀 12,747評論 0 33
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法匙握,內(nèi)部類的語法咆槽,繼承相關(guān)的語法,異常的語法圈纺,線程的語...
    子非魚_t_閱讀 31,644評論 18 399
  • leetcode刷題記錄本文記錄一下leetcode刷題記錄秦忿,記錄一下自己的解法和心得。 LeetCode Two...
    EarthChen閱讀 3,466評論 0 6
  • 爸蛾娶,這是你送我的小葫蘆灯谣。 這是咱們?nèi)易吆笠淮我黄鸪鲩T。 你說你想出門溜達(dá)溜達(dá)蛔琅。 可是到地方了你就一直躺著胎许。 我媽...
    挖掘機(jī)來了閱讀 468評論 0 0
  • 思考:一個人只有按照自己內(nèi)心的感覺和意愿辜窑,才能做真正的自己。有時候寨躁,我們真的需要問問自己當(dāng)下的感覺穆碎,聽下自己的心聲...
    小笨魚王月閱讀 171評論 0 0