劍指 week1

1.找出數(shù)組中重復(fù)的數(shù)字

注意點(diǎn):

  • 1.有一個(gè)出現(xiàn)在0~n-1之外的就要返回-1
  • 2.空值返回-1
  • 3.時(shí)間復(fù)雜度O(n),空間復(fù)雜度O(1)的解法
class Solution {
public:
    int duplicateInArray(vector<int>& nums) {
        int n=nums.size();
       if(n==0)   return -1;
       for(int i=0;i<n;i++)
       {
          if(nums[i]<0||nums[i]>=n) return -1;
       }
       for(int i=0;i<n;i++)
       {
          while(nums[nums[i]]!=nums[i])swap(nums[i],nums[nums[i]]);
          if(nums[i]!=i)    return nums[i];
       }
       return -1;
    }
};

2.不修改數(shù)組找出重復(fù)的數(shù)字

分治+抽屜原理呵恢,將每個(gè)數(shù)的取值的區(qū)間[1, n]劃分成[1, n/2]和[n/2+1, n]兩個(gè)子區(qū)間,然后分別統(tǒng)計(jì)兩個(gè)區(qū)間中數(shù)的個(gè)數(shù)。

class Solution {
public:
    int duplicateInArray(vector<int>& nums) {
        int l=1,r=nums.size()-1;//n+1長度的數(shù)組
        while(l<r)
        {
            int mid=l+r>>1;//[l,mid],[mid+1,r]
            int s=0;
            for(auto x:nums)    s+=x>=l&&x<=mid;
            if(s>mid-l+1)  r=mid;
            else
                    l=mid+1;
        }
        return l;
    }
};

3.二維數(shù)組中的查找

每一步會(huì)排除一行或者一列猾普,矩陣一共有 n 行,m 列,所以最多會(huì)進(jìn)行 n+m 步纠俭。所以時(shí)間復(fù)雜度是 O(n+m)冰木。

class Solution {
public:
    bool searchArray(vector<vector<int>> array, int target) {
        if(array.empty())return false;
        int i=0,j=array[0].size()-1;
        while(i<array.size()&&j>=0)
        {
            if(array[i][j]==target) return true;
            if(array[i][j]>target)  j--;
            else i++;
        }
        return false;
    }
};

4.替換空格

class Solution {
public:
    string replaceSpaces(string &str) {
        string res;
        for(auto x:str)
        {
            if(x==' ')
                res+="%20";
            else
                res+=x;
        }
        return res;
    }
};

5.從尾到頭打印鏈表

反向迭代器漲姿勢了驮樊,vector<int>(res.rbegin(),res.rend())

class Solution {
public:
    vector<int> printListReversingly(ListNode* head) {
        vector<int>res;
        while(head)
        {
            res.push_back(head->val);
            head=head->next;
        }
        return vector<int>(res.rbegin(),res.rend());
    }
};

6.重建二叉樹

class Solution {
public: 
    unordered_map<int,int>mp;
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int n=preorder.size();
        for(int i=0;i<n;i++)
            mp[inorder[i]]=i;//記錄中序遍歷中數(shù)對應(yīng)的位置
        return dfs(preorder,inorder,0,n-1,0,n-1);
    }
    TreeNode* dfs(vector<int>& pre,vector<int>& in,int pl,int pr,int il,int ir)
    {
        
        if(il>ir) return NULL;
        int k=mp[pre[pl]]-il;//中序遍歷中左子樹的數(shù)量
        //重構(gòu)根節(jié)點(diǎn)
        TreeNode* root=new TreeNode(pre[pl]);
        //遞歸左子樹
        root->left=dfs(pre,in,pl+1,pl+k,il,il+k-1);
        //遞歸右子樹
        root->right=dfs(pre,in,pl+k+1,pr,il+k+1,ir);
        
        return root;
    }
};

7.二叉樹的下一個(gè)節(jié)點(diǎn)

俗稱樹的后繼,給定一棵二叉樹的其中一個(gè)節(jié)點(diǎn),請找出中序遍歷序列的下一個(gè)節(jié)點(diǎn)片酝。

    1. 如果有右子樹囚衔,那么右子樹最左側(cè)結(jié)點(diǎn)就是答案
    1. 如果沒有右子樹,那么就一直往上找雕沿,直到找到當(dāng)前這個(gè)點(diǎn)练湿,它是它father的左子樹,那么它的father就是后繼
class Solution {
public:
    TreeNode* inorderSuccessor(TreeNode* p) {
        if(p->right)
        {
            p=p->right;
            while(p->left)
                p=p->left;
            return p;
        }
        while(p->father&&p==p->father->right) p=p->father;
            return p->father;
    }
};

8.用兩個(gè)棧實(shí)現(xiàn)隊(duì)列

兩個(gè)棧stk與cache审轮,一個(gè)用于存肥哎,另一個(gè)用于取或者查

class MyQueue {
public:
    stack<int>stk,cache;
    /** Initialize your data structure here. */
    MyQueue() {
        
        
    }
    
    /** Push element x to the back of queue. */
    void push(int x) {
        stk.push(x);
    }
    
    void copy(stack<int>&a,stack<int>&b)
    {
        while(a.size())
        {
            b.push(a.top());
            a.pop();
        }

    }
    
    /** Removes the element from in front of queue and returns that element. */
    int pop() {
        copy(stk,cache);
        int res=cache.top();
        cache.pop();
        copy(cache,stk);
        return res;
        
    }
    
    /** Get the front element. */
    int peek() {
        copy(stk,cache);
        int res=cache.top();
        copy(cache,stk);
        return res;
        
    }
    
    /** Returns whether the queue is empty. */
    bool empty() {
        return stk.empty();
    }
};

9.斐波那契數(shù)列

  • 面試的時(shí)候能不用遞歸就不用遞歸
class Solution {
public:
int res=0;
    int Fibonacci(int n) {
        if(n==0)    return 0;
        if(n==1||n==2)    return 1;
        return res=Fibonacci(n-1)+Fibonacci(n-2);
    }
};
  • 首選dp
class Solution {
public:
    int Fibonacci(int n) {
        int dp[n+10];
        dp[0]=0;
        dp[1]=1;
        dp[2]=1;
        for(int i=3;i<=n;i++)
        {
            dp[i]=dp[i-1]+dp[i-2];
        }
        return dp[n];
    }
};

10.矩陣中的路徑

dfs+回溯,注意邊界條件的順序

class Solution {
public:
    int dx[4]={0,1,0,-1};
    int dy[4]={1,0,-1,0};
    bool hasPath(vector<vector<char>>& matrix, string &str) {
        for(int i=0;i<matrix.size();i++)
            for(int j=0;j<matrix[i].size();j++)
                if(dfs(matrix,str,0,i,j))
                    return true;
        return false;
    }
   bool dfs(vector<vector<char>>&matrix,string &str,int u,int x,int y)
    {
        if(matrix[x][y]!=str[u])    
            return false;
        if(u==str.size()-1)
            return true;
        char t=matrix[x][y];
        matrix[x][y]='*';
        for(int i=0;i<4;i++)
        {
            int a=x+dx[i],b=y+dy[i];
            if(a>=0&&a<matrix.size()&&b>=0&&b<matrix[0].size())
                if(dfs(matrix,str,u+1,a,b)) 
                    return true;
        }
        matrix[x][y]=t;
        return false;
    }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疾渣,一起剝皮案震驚了整個(gè)濱河市篡诽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌榴捡,老刑警劉巖杈女,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吊圾,居然都是意外死亡达椰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門项乒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啰劲,“玉大人,你說我怎么就攤上這事檀何∮悖” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵频鉴,是天一觀的道長栓辜。 經(jīng)常有香客問我,道長砚殿,這世上最難降的妖魔是什么啃憎? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮似炎,結(jié)果婚禮上辛萍,老公的妹妹穿的比我還像新娘悯姊。我一直安慰自己,他們只是感情好贩毕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布悯许。 她就那樣靜靜地躺著,像睡著了一般辉阶。 火紅的嫁衣襯著肌膚如雪先壕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天谆甜,我揣著相機(jī)與錄音垃僚,去河邊找鬼。 笑死规辱,一個(gè)胖子當(dāng)著我的面吹牛谆棺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播罕袋,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼改淑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了浴讯?” 一聲冷哼從身側(cè)響起朵夏,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎榆纽,沒想到半個(gè)月后仰猖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掠河,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年亮元,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唠摹。...
    茶點(diǎn)故事閱讀 39,773評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖奉瘤,靈堂內(nèi)的尸體忽然破棺而出勾拉,到底是詐尸還是另有隱情,我是刑警寧澤盗温,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布藕赞,位于F島的核電站,受9級特大地震影響卖局,放射性物質(zhì)發(fā)生泄漏斧蜕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一砚偶、第九天 我趴在偏房一處隱蔽的房頂上張望批销。 院中可真熱鬧洒闸,春花似錦、人聲如沸均芽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掀宋。三九已至深纲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間劲妙,已是汗流浹背湃鹊。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留镣奋,地道東北人币呵。 一個(gè)月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像唆途,于是被迫代替她去往敵國和親富雅。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評論 2 354

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