刷题笔记:LeetCode精选TOP面试题

#1.两数之和

暴力求解:时间复杂度O(n^2)   空间复杂度O(1)

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
      vector<int> result;
      for(int i=0;i<nums.size();i++){
          for(int j=i+1;j<nums.size();j++){
              if(nums[i]+nums[j]==target){
                  result.push_back(i);
                  result.push_back(j);
                  return result;
              }
          }
      }   
      return result;
    }
};

一遍哈希表法:时间复杂度O(n)   空间复杂度O(n)

class Solution {
public:
	vector<int> twoSum(vector<int>& nums, int target) {
		unordered_map<int, int> myhash;
		vector<int> out;
        /* 首先所有的数据哈希映射表 */
		for (int i = 0; i < nums.size(); i++) {
			myhash[nums[i]] = 1;
		}

		for (int i = 0; i < nums.size(); i++) {
            /* 在这里 判断 如果 存在 target - nums[i] 对应的 值  并且这个值不是自己 */
            /*映射关系  key->value,  key:target - nums[i],  value:myhash[target - nums[i]]*/
			if (myhash[target - nums[i]] && (myhash[target - nums[i]] != i)) {
				out.push_back(i);
				out.push_back(myhash[target - nums[i]]);
				return out;
			}
		}

		return out;
	}
};

#2.两数相加

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode result(-1);
        int flag=0;
        ListNode *p=&result;
        while(l1!=NULL || l2!=NULL){
            int temp=l1?l1->val:0;
            temp+=l2?l2->val:0;
            temp+=flag;
            if(temp>=10){
                flag=1;
                temp=temp-10;
            }
            else{
                flag=0;
                temp=temp;
            }
            p->next=new ListNode(temp);
            p=p->next;
            if(l1) l1=l1->next;
            if(l2) l2=l2->next;
        }
        if(flag){
            p->next=new ListNode(1);
        }
        return result.next;
    }
};

#3.无重复字符的最长字串

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
     //窗口头指针
     int begin=0;
     int result=0;
     std::string word="";
     //字符哈希
     int char_map[128]={0};
     for(int i=0;i<s.length();i++){
         char_map[s[i]]++;
         if(char_map[s[i]]==1){//没出现过
             word+=s[i];
             if(result<word.length()){
                 result=word.length();
             }
         }
         else{//将重复的字符s[i]去掉
             while(begin<i && char_map[s[i]]>1){
                  char_map[s[begin]]--;
                  begin++;
             }
             word="";
             for(int j=begin;j<=i;j++){
                 word+=s[j];
             }
         }
     }
     return result;
    }
};

#5.最长回文串

class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.size();
        vector<vector<int>> dp(n, vector<int>(n));
        string ans;
        for (int l = 0; l < n; ++l) {
            for (int i = 0; i + l < n; ++i) {
                int j = i + l;
                if (l == 0) {
                    dp[i][j] = 1;
                }
                else if (l == 1) {
                    dp[i][j] = (s[i] == s[j]);
                }
                else {
                    dp[i][j] = (s[i] == s[j] && dp[i + 1][j - 1]);
                }
                if (dp[i][j] && l + 1 > ans.size()) {
                    ans = s.substr(i, l + 1);
                }
            }
        }
        return ans;
    }
};

#7.整数反转

class Solution {
public:
    int reverse(int x) {
        long long ans=0;
        const int maxInt=0x7FFFFFFF;
        const int minInt=0x80000000;
        while(x!=0){
            ans=ans*10+x%10;
            x=x/10;
        }
        if(ans>maxInt || ans<minInt){
            return 0;
        }
        return ans;
    }
};

#8.字符串转换整数(atoi)

class Solution {
public:
    int myAtoi(string str) {
        bool flag=true;
        long long ans=0;
        const int maxInt=0x7FFFFFFF;
        const int minInt=0x80000000;
        const long long MAX = 0x100000000;
        int cur=0;
        //空格
        while(cur<str.length() && str[cur]==' '){
            cur++;
        }
        //符号
        if(cur<str.length() &&  str[cur]=='+'){
            flag=true;
            cur++;
        }
        else if(str[cur]=='-' && cur<str.length()){
            flag=false;
            cur++;
        }
        //求数
        for(;cur<str.length();cur++){
            if(str[cur]>='0' && str[cur]<='9'){
                ans=ans*10+(str[cur]-'0');
                if(ans > MAX){
                    ans=MAX;
                    break;
                }
            }
            else{
                break;
            }
        }
        if(!flag){
            ans=-ans;
        }
        if(ans>maxInt){
            return maxInt;
        }
        else if(ans<minInt){
            return minInt;
        }

        return ans;

    }
};

#11.盛最多水的容器

class Solution {
public:
    int maxArea(vector<int>& height) {
        if(height.size()==0){
            return 0;
        }
        if(height.size()==1){
            return height[0];
        }
        int left=0;
        int right=height.size()-1;
        int result=0;
        while(left<right){
            //短的值*区间长度
            int temp=(right-left)*(height[left]<height[right]?height[left]:height[right]);
            if(temp>result){
                result=temp;
            }
            if(height[left]<height[right]){
                left++;
            }
            else{
                right--;
            }
        }
        return result;
    }
};

#13.罗马数字转整数

class Solution {
public:
    int romanToInt(string s) {
        int result=0;
        map<char,int> luomab={
            {'I',1},
            {'V',5},
            {'X',10},
            {'L',50},
            {'C',100},
            {'D', 500},
            {'M', 1000}
        };//初始化哈希表
        for(int i=0;i<s.length();i++)
        {
            if(luomab[s[i]] < luomab[s[i+1]])
                result -= luomab[s[i]];
            else
            {
                result += luomab[s[i]];
            }
        }
        return result;
    }
};

 #14.最长公共前缀

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        if(strs.size()==0){
            return "";
        }
        for(int i=0;i<strs[0].size();i++){
            char temp=strs[0][i];
            for(int j=0;j<strs.size();j++){
                if(strs[j].size()==i ||strs[j][i]!=temp){
                    return strs[0].substr(0,i);
                }
            }
        }
        return strs[0];
    }
};

#15.三数之和

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int n=nums.size();
        sort(nums.begin(),nums.end());
        vector<vector<int>> ans;
        for(int first=0;first<n;first++){
            if(first>0&&nums[first]==nums[first-1]){
                continue;
            }
            int second=first+1;
            int third=n-1;
            int target=-nums[first];
            for(;second<third;second++){
                if(second>first+1 && nums[second]==nums[second-1]){
                    continue;
                }
                while(second<third&& nums[second]+nums[third]>target){
                    third--;
                }
                if(second==third){
                    break;
                }
                if(nums[second]+nums[third]==target){
                    ans.push_back({nums[first],nums[second],nums[third]});
                }
            }
        }
        return ans;
    }
};

#17.电话号码的字母组合

DFS解决

class Solution {
public:
    map<char,string> hashmap={
        {'2',"abc"},{'3',"def"},{'4',"ghi"},
        {'5',"jkl"},{'6',"mno"},{'7',"pqrs"},
        {'8',"tuv"},{'9',"wxyz"}
    };

    void DFS(int index,string digits,vector<string>&results,string &str){
        if(index==digits.size()){
            results.push_back(str);
        }
        for(int i=0;i<hashmap[digits[index]].size();i++){
            str+=hashmap[digits[index]][i];
            DFS(index+1,digits,results,str);
            str.pop_back();
        }
    }
    vector<string> letterCombinations(string digits) {
        vector<string> results;
        string str;
        if(digits.size()==0){
            return results;
        }
        DFS(0,digits,results,str);
        return results;
    }
};

#19.删除链表的倒数第N个节点

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode result(0);
        result.next=head;
        for(int i=0;i<n;i++){
            head=head->next;
        }
        ListNode *temp=&result;
        while(head!=NULL){
            head=head->next;
            temp=temp->next;
        }
        ListNode *trash=temp->next;
        temp->next=trash->next;
        delete trash;
        return result.next;


    }
};

#20.有效的括号

class Solution {
public:
    bool isValid(string s) {
        map<char,int> hashmap={{'(',1},{')',-1},{'{',2},{'}',-2},{'[',3},{']',-3}};
        stack<int> _stack;
        for(int i=0;i<s.size();i++){
            if(hashmap[s[i]]>0){
                _stack.push(hashmap[s[i]]);
            }
            else{
                if(!_stack.empty() && (hashmap[s[i]]+_stack.top())==0){
                    _stack.pop();
                }
                else{
                    return false;
                }
            }
        }
        return _stack.empty();

    }
};

#21.合并两个有序链表

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode temp_head(0);
        ListNode *pre=&temp_head;
        while(l1 && l2){
            if(l1->val < l2->val){
                pre->next=l1;
                l1=l1->next;
            }
            else{
                pre->next=l2;
                l2=l2->next;
            }
            pre=pre->next;
        }
        if(l1){
            pre->next=l1;
        }
        if(l2){
            pre->next=l2;
        }

        return temp_head.next;
    }
};

#22.括号生成

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector<string> result;
        int lc=0,rc=0;
        DFS(result,"",n,lc,rc);
        return result;
    }

private:
    void DFS(vector<string>& result,string path,int n,int lc ,int rc){
        if(rc>lc || lc>n || rc>n){
            return;
        }
        if(lc==rc && lc==n){
            result.push_back(path);
        }
        DFS(result,path+'(',n,lc+1,rc);
        DFS(result,path+')',n,lc,rc+1);
    }
};

#23.合并K个排序链表

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
      if(lists.size()==0)
      {
          return NULL;
      }
      if(lists.size()==1)
      {
          return lists[0];
      }  
      if(lists.size()==2)
      {
          return mergeTwoLIsts(lists[0],lists[1]);
      }
      int mid=lists.size()/2;
      vector<ListNode*> sub_lis1,sub_lis2;
      for(int i=0;i<mid;i++)
      {
          sub_lis1.push_back(lists[i]);
      }
      for(int i=mid;i<lists.size();i++)
      {
          sub_lis2.push_back(lists[i]);
      }

    ListNode* l1=mergeKLists(sub_lis1);
    ListNode* l2=mergeKLists(sub_lis2);
    return mergeTwoLIsts(l1,l2);

    }
private:
  ListNode* mergeTwoLIsts(ListNode* lists1,ListNode* lists2)
  {
      if(lists1==NULL)
      {
          return lists2;
      }
      if(lists2==NULL)
      {
          return lists1;
      }
      ListNode temp(0);
      ListNode* result=&temp;
      while(lists1 && lists2)
      {
          if(lists1->val < lists2->val)
          {
              result->next=lists1;
              lists1=lists1->next;
          }
          else
          {
              result->next=lists2;
              lists2=lists2->next;
          }
          result=result->next;
      }
      if(!lists1)
      {
          result->next=lists2;
      }
      if(!lists2)
      {
          result->next=lists1;
      }
      return temp.next;
  }
};

#26.删除排序数组中的重复项

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

    }
};

#28.实现strStr()

class Solution {
public:
    int strStr(string haystack, string needle) {
        // 特殊情况判断
        if(haystack.length() < needle.length()) return -1;
        if(needle.length() == 0) return 0;
        
        // 双指针,i指向haystack,j指向needle
        int i = 0, j = 0;
        while(i < haystack.length()) {
            // 判断当前两个字符是否相等
            if(haystack[i] == needle[j]) {
                // 相等,则i,j自增1,若此时j越界,则找到索引
                j++;
                i++;
                if(j >= needle.length())
                    return i - j;
            }
            else {
                // 不相等,判断j是否越界
                if(j < needle.length()) {
                    //未越界,则i重置为haystack中与needle的第一个字符相等的第一个字符位置的后一位,j重置为0
                    i = i - j + 1;
                    j = 0;
                }
                else {
                    // 越界,i自增1
                    i++;
                }
            }
        }
        return -1;
    }
};

#29.两数相除

class Solution {
public:
    int divide(int dividend, int divisor) { // 被除数 除数
     if(dividend==INT_MIN&&divisor==-1)return INT_MAX;
        if(dividend==divisor)return 1;
        int sum=0,t=0;//第一层累加数
        int sums=0,ts=0;//第二层累加数
        int sumss=0,tss=0;//第三层累加数
        int res=0;
        int flat=(dividend^divisor);//结果正负标志位
        dividend=(dividend<0)?dividend:-dividend;//被除数取负值
        divisor=(divisor<0)?divisor:-divisor;//除数取负值
       while(dividend<=divisor){//暴力累加法
               sum+=divisor;
                t--;
            if(sums>INT_MIN-sum){//判断第一层累加是否超出
                sums+=sum;
                ts+=t;
            }
            if(sumss>INT_MIN-sums){//判断第二层累加是否超出
               sumss+=sums;
                tss+=ts; 
            }
           if(dividend-sumss<0){//判断三层累加是否超出
                res+=tss;
                dividend-=sumss;
           }else{//超出则普通累加
                res--;
                dividend-=divisor;
                sum=0;
                t=0;
                sums=0;
                ts=0;
                sumss=0;
                tss=0;
           }
       }
       return(flat<0)?res:-res;
    }
};

#33.搜索旋转排序数组

class Solution {
public:
    int search(vector<int>& nums, int target) {
     int begin=0;
     int end=nums.size()-1;
     while(begin<=end){
         int mid=(begin+end)/2;
         if(nums[mid]==target){
             return mid;
         }
         else if(target<nums[mid]){
             if(nums[begin]<nums[mid]){
                 if(nums[begin]<=target){
                     end=mid-1;
                 }
                 else{
                     begin=mid+1;
                 }
             }
             else if(nums[begin]>nums[mid]){
                 end=mid-1;
             }
             else if(nums[begin]==nums[mid]){
                 begin=mid+1;
             }
         }
         else if(target > nums[mid]){
             if(nums[begin]<nums[mid]){
                 begin=mid+1;
             }
             else if(nums[begin] > nums[mid]) {
                 if(nums[begin]>target){
                     begin=mid+1;
                 }
                 else if(nums[begin]<=target){
                     end=mid-1;
                 }
             }
             else if(nums[begin]==nums[mid]){
                 begin=mid+1;
             }
         }
     }
     return -1;
    }
};

#34.在排序数组中查找元素的第一个和最后一个位置

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int begin=0;
        int end=nums.size()-1;
        vector<int> range={-1,-1};
        //查找区间左端点
        while(begin<=end){
            int mid=(begin+end)/2;
            if(target == nums[mid]){
                //找到左端点
                if(mid==0 || target>nums[mid-1]){
                    range[0]=mid;
                    break;
                }
                else{
                    end=mid-1;
                }
            }
            else if(target > nums[mid]){
                begin=mid+1;
            }
            else{
                end=mid-1;
            }
        }
        if(range[0]==-1){
            return range;
        }
        //查找区间右端点
        begin=range[0];
        end=nums.size()-1;
        while(begin<=end){
            int mid=(begin+end)/2;
            if(target == nums[mid]){
                //找到右端点
                if(mid==nums.size()-1 || target<nums[mid+1]){
                    range[1]=mid;
                    break;
                }
                else{
                    begin=mid+1;
                }
            }
            else if(target > nums[mid]){
                begin=mid+1;
            }
            else{
                end=mid-1;
            }
        }
        return range;
    }
};

#36.有效的数独

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        //三个哈希表
        int row[9][10]={0};
        int col[0][10]={0};
        int box[0][10]={0};
        for(int i=0;i<9;i++){
            for(int j=0;j<9;j++){
                if(board[i][j]=='.'){
                    continue;
                }
                int curNumber=board[i][j]-'0';
                if(row[i][curNumber]!=0) return false;
                if(col[j][curNumber]!=0) return false;
                if(box[(i/3)*3+j/3][curNumber]!=0) return false;
                row[i][curNumber]=1;
                col[j][curNumber]=1;
                box[(i/3)*3+j/3][curNumber]=1;
            }
        }
        return true;
    }
};

#38.外观数列

class Solution {
public:
    string countAndSay(int n) {
        if(n==1) return"1";
        string pre=countAndSay(n-1);
        string ans;
        int i=0;
        for(int j=0;j<=pre.size();j++){
            if(pre[i]==pre[j]){
                continue;
            }
            else{
                ans+=to_string(j-i)+pre[i];
                i=j;
            }
        }
        return ans;
    }
};


#46.全排列

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> result;
        vector<int> path;
        set<int> visited;
        DFS(result,path,nums,visited);
        return result;
    }
private:
    void DFS(vector<vector<int>> &result,vector<int>&path,vector<int> &nums,set<int> &visited){
        if(visited.size()==nums.size()){
            result.push_back(path);
            return;
        }
        for(int i=0;i<nums.size();i++){
            if(visited.find(i)==visited.end()){
                visited.insert(i);
                path.push_back(nums[i]);
                DFS(result,path,nums,visited);
                visited.erase(i);
                path.pop_back();
            }
        }
    }
};



#48.旋转图像

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n=matrix.size();
        for(int i=0;i<(n+1)/2;i++){
            for(int j=0;j<n/2;j++){
                int temp = matrix[n - 1 - j][i];
                matrix[n - 1 - j][i] = matrix[n - 1 - i][n - j - 1];
                matrix[n - 1 - i][n - j - 1] = matrix[j][n - 1 -i];
                matrix[j][n - 1 - i] = matrix[i][j];
                matrix[i][j] = temp;
            }
        }
    }
};

#49.字母异位词分组

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>> result;
        //哈希表
        std::map<string,vector<string>> anagram_hash;
        for(int i=0;i<strs.size();i++){
            //先对str排序;
            string temp=strs[i];
            std::sort(temp.begin(),temp.end());
            //如果有同组元素则添加
            if(anagram_hash.find(temp)!=anagram_hash.end()){
                anagram_hash[temp].push_back(strs[i]);
            }
            else{
                //创建新的
                vector<string> new_vecstr;
                anagram_hash[temp]=new_vecstr;
                anagram_hash[temp].push_back(strs[i]);
            }
        }
        std::map<string,vector<string>>::iterator iter;
        iter=anagram_hash.begin();
        while(iter!=anagram_hash.end()){
            result.push_back(iter->second);
            iter++;
        }
        return result;
    }
};

#50.Pow(x,n)

注意int负数的越界情况,要用long long

class Solution {
public:
    double myPow(double x, int n) {
        long long N=n;
        if(N<0){
         return 1.0/_pow(x,-N);   
        }        
        return _pow(x,N);
    }
private:
    double _pow(double x,long long  n ){
        if(n==0){
            return 1.0;
        }
        double y=_pow(x,n/2);
        return n%2?y*y*x:y*y;
    }
};

 

#53.最大子序和

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int result=0;
        vector<int> dp(nums.size(),0);
        dp[0]=nums[0];
        result=dp[0];
        for(int i=1;i<nums.size();i++){
            dp[i]=std::max(dp[i-1]+nums[i],nums[i]);
            if(dp[i]>result){
                result=dp[i];
            }
        }

        return result;
    }
};

#54.螺旋矩阵

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        if(matrix.size()==0 || matrix[0].size()==0){
            return {};
        }
        static const int dx[4]={0,1,0,-1};
        static const int dy[4]={1,0,-1,0};
        vector<int> result;
        int rows=matrix.size();
        int cols=matrix[0].size();
        vector<vector<int>> visit(rows,vector<int>(cols,0));
        int newx=0,newy=0;
        int index=0;
        for(int i=0;i<rows*cols;i++){
            result.push_back(matrix[newx][newy]);
            visit[newx][newy]=1;
            if(newx+dx[index]<0 || newx+dx[index]>=rows ||newy+dy[index]<0 || newy+dy[index]>=cols || visit[newx+dx[index]][newy+dy[index]]==1){
                index=(index+1)%4;
            }
            newx+=dx[index];
            newy+=dy[index];
        }

        return result;
    }
};


#55.跳跃游戏

class Solution {
public:
    bool canJump(vector<int>& nums) {
        std::vector<bool> isArrive(nums.size(),false);
        int max=0;
        int last=-1;
        for(int i=0;i<=max && max<nums.size() ;i++){
            if(i+nums[i]>max){
                max=i+nums[i];
                printf("max:%d\n",max);
            }
            if(last==i){
                break;
            }
            last=i;
            printf("last:%d\n",last);
        }
        
        return (max >= nums.size()-1)?true:false;
    }
};

#56.合并区间

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        if(intervals.size()==0){
            return {};
        }
        std:sort(intervals.begin(),intervals.end(),cmp());
        vector<vector<int>> result;
        for(int i=0;i<intervals.size();i++){
            int L=intervals[i][0];
            int R=intervals[i][1];
            if(result.empty() || result.back()[1]<L){
                result.push_back({L,R});
            }
            else{
                result.back()[1]=max(R,result.back()[1]);
            }
        }
        return result;
    }
private:
    struct cmp{
        bool operator()(vector<int> &A,vector<int> &B){
            return A[0]<B[0];
        }
    };
};


#62.不同路径

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m,vector<int>(n,0));
        dp[0][0]=1;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(i-1>=0){
                    dp[i][j]+=dp[i-1][j];
                }
                if(j-1>=0){
                    dp[i][j]+=dp[i][j-1];
                }
            }
        }
        return dp[m-1][n-1];
    }
};

#66.加一

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

#69.x的平方根

class Solution {
public:
    int mySqrt(int x) {
        int l=0,r=x,ans=-1;
        while(l<=r){
            int mid=(l+r)/2;
            if((long long)mid*mid<=x){
                ans=mid;
                l=mid+1;
            }
            else{
                r=mid-1;
            }
        }
        return ans;
    }
};

#70.爬楼梯

class Solution {
public:
    int climbStairs(int n) {
        //注意:n+3是为了防止传进来0时运行出错
        vector<int> dp(n+3,0);
        dp[1]=1;
        dp[2]=2;
        for(int i=3;i<=n;i++){
            dp[i]=dp[i-1]+dp[i-2];
        }
        return dp[n];
    }
};

#73.矩阵置零

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
    bool flag = false;      //用作第一列的标识位
    int m = matrix.size(), n = matrix[0].size();
    for(int i = 0; i < m; ++i)       //设置标识位
    {
        if(matrix [i][0] == 0)  flag = true;    //单独判断第一列的情况
        for(int j = 1; j < n; ++j)
        {
            if(matrix[i][j] == 0)    matrix[i][0] = matrix[0][j] = 0;
        }     
    }
    for(int i = m-1; i >= 0; --i)       //更新数值时,因为标识位都在左上角,所以自下而上更新0值
    {
        for(int j = n-1; j >= 1; --j)
        {
          if(matrix[i][0] == 0 || matrix [0][j] == 0)
            matrix[i][j] = 0;
        }     
        if(flag)    matrix[i][0] = 0;   //第一列元素单独判断
    }

    }
};

#75.颜色分类

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int p0=0;
        int p2=nums.size()-1;
        int cur=0;
        while(cur<=p2){
            if(nums[cur]==0){
                nums[cur]=nums[p0];
                nums[p0]=0;
                p0++;
                cur++;
            }
            else if(nums[cur]==2){
                nums[cur]=nums[p2];
                nums[p2]=2;
                p2--;
            }
            else{
                cur++;
            }
        }
    }
};

#78.子集

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> result;
        vector<int> path;
        result.push_back(path);
        _subsets(result,path,0,nums);
        return result;
    }
private:
    void _subsets(vector<vector<int>> &result,vector<int> &path,int index,vector<int>& nums){
        if(index>=nums.size()){
            return;
        }
        path.push_back(nums[index]);
        result.push_back(path);
        _subsets(result,path,index+1,nums);
        path.pop_back();
        _subsets(result,path,index+1,nums);
    }
};

#79.单词搜索

static  const int dx[]={1,-1,0,0};
static  const int dy[]={0,0,1,-1};
class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        if(board.size()==0){
            return false;
        }
        vector<vector<int>> visit(board.size(),vector<int>(board[0].size(),0));
        for(int i=0;i<board.size();i++){
            for(int j=0;j<board[0].size();j++){
                if(DFS(board,visit,i,j,0,word)){
                    return true;
                }
            }
        }
        return false;
    }
private:

    bool DFS(vector<vector<char>> &board, vector<vector<int>> &visit,int newx,int newy,int index,string word){
        if(index==word.size()-1){
            return board[newx][newy]==word[index];
        }
        if(board[newx][newy]==word[index]){
            visit[newx][newy]=1;
            for(int i=0;i<4;i++){
                int tempx = newx+dx[i];
                int tempy = newy+dy[i];
                if(tempx>=0 && tempx<board.size() && tempy>=0 && tempy<board[0].size() && visit[tempx][tempy]==0){
                    if( DFS(board,visit,tempx,tempy,index+1,word)){
                        return true;
                    }
                }
            }
            visit[newx][newy]=0;
        }
        return false;
        
    }
};

#88.合并两个有序数组

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int i=m+n-1;
        m--;
        n--;
        while(n>=0){
            while(m>=0 && nums1[m]>nums2[n]){
                nums1[i]=nums1[m];
                i--;
                m--;
            }
            nums1[i]=nums2[n];
            i--;
            n--;
        }
    }
};

 

#94.二叉树的中序遍历

递归

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        midorder(root,result);
        return result;
    }
private:
    void midorder(TreeNode *node,vector<int> &result){
        if(node==NULL){
            return;
        }
        midorder(node->left,result);
        result.push_back(node->val);
        midorder(node->right,result);
    }
};

非递归

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> _stack;
        TreeNode *p=root;
        while(!_stack.empty() || p!=NULL){
            if(p!=NULL){
                _stack.push(p);
                p=p->left;
            }
            else{
                p=_stack.top();
                result.push_back(p->val);
                _stack.pop();
                p=p->right;
            }
        }

        return result;
    }
};

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问 12-6 用Timer类调度任务 12-7 练习 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值