Rrui的Leetcode算法刷题笔记(八)

368. Largest Divisible Subset

注:中等题,不解释,浪费时间。faster than 100.00%。

417. Pacific Atlantic Water Flow

注:中等题,不解释,浪费时间。faster than 100.00%。

Rrui的Leetcode算法刷题笔记(九)链接如下:

https://blog.csdn.net/Rrui7739/article/details/84563790

371. 两整数之和

class Solution {
public:
    int getSum(int a, int b) {
       //按位取异或
        int result = a^b;
        //判断是否需要进位
        int forward = (a&b) <<1;
        if(forward!=0){
            //如有进位,则将二进制数左移一位,进行递归
            return getSum(result,forward);
        }
        return result;
    }
};

374. 猜数字大小

// Forward declaration of guess API.
// @param num, your guess
// @return -1 if my number is lower, 1 if my number is higher, otherwise return 0
int guess(int num);

class Solution {
public:
    int guessNumber(int n) {
        
        long low=0,high=n;
        
        while(1)
        {
            long mid=(low+high)/2;
            if(guess(mid)==1)
                low=mid+1;
            else if(guess(mid)==-1)
                high=mid-1;
            else return mid;
        }
    }
};

377. 组合总和 Ⅳ

class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
    int N=nums.size();
    sort(nums.begin(),nums.end());
    int dp[target+1]={0};
        dp[0]=1;
        for(int i=1;i<=target;i++)
        {
            for(int j=0;j<N;j++)
            {
                // sum+=
                // cout<<i<<" "<<j<<endl;
                if(i>=nums[j])dp[i]+=dp[i-nums[j]];
                else break;
            }
        }
        //从小到大的顺序呢进行排列 然后每个数字都向前遍历
     return dp[target];   
    }
};

378. 有序矩阵中第K小的元素

class Solution {
public:
    int kthSmallest(vector<vector<int>>& matrix, int k) {
        int n=matrix.size();
        priority_queue<int> q;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                q.push(matrix[i][j]);
                if(q.size()>k) q.pop();
            }

        }
        return q.top();
    }
};

380. 常数时间插入、删除和获取随机元素

class RandomizedSet {
public:
    /** Initialize your data structure here. */
    RandomizedSet() {}

    /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
    bool insert(int val) {
        if (m.count(val)) return false;
        nums.push_back(val);
        m[val] = nums.size() - 1;
        return true;
    }

    /** Removes a value from the set. Returns true if the set contained the specified element. */
    bool remove(int val) {
        if (!m.count(val)) return false;
        int last = nums.back();
        m[last] = m[val];
        nums[m[val]] = last;
        nums.pop_back();
        m.erase(val);
        return true;
    }

    /** Get a random element from the set. */
    int getRandom() {
        return nums[rand() % nums.size()];
    }
private:
    vector<int> nums;
    unordered_map<int, int> m;
};

381. O(1) 时间插入、删除和获取随机元素 - 允许重复

class RandomizedCollection {
public:
    /** Initialize your data structure here. */
    RandomizedCollection() {}
     
    /** Inserts a value to the collection. Returns true if the collection did not already contain the specified element. */
    bool insert(int val) {
        m[val].insert(nums.size());
        nums.push_back(val);
        return m[val].size() == 1;
    }
     
    /** Removes a value from the collection. Returns true if the collection contained the specified element. */
    bool remove(int val) {
        if (m[val].empty())
        {
            return false;
        }
        int idx = *m[val].begin();
        m[val].erase(idx);
        if (nums.size() - 1 != idx)
        {
            int t = nums.back();
            nums[idx] = t;
            m[t].erase(nums.size() - 1);
            m[t].insert(idx);
        }
        nums.pop_back();
        return true;
    }
     
    /** Get a random element from the collection. */
    int getRandom() {
        return nums[rand() % nums.size()];
    }
 
private:
    vector<int> nums;
    unordered_map<int, unordered_set<int>> m;
};

382. 链表随机节点

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    /** @param head The linked list's head.
        Note that the head is guaranteed to be not null, so it contains at least one node. */
    Solution(ListNode* head) {
        len=0;
        this->head=head;
        ListNode *cur=head;
        while(cur)
        {
            ++len;
            cur=cur->next;
        }
    }
     
    /** Returns a random node's value. */
    int getRandom() {
        int t=rand()%len;
        ListNode *cur=head;
        while(t)
        {
            --t;
            cur=cur->next;
        }
        return cur->val;
    }
private:
    int len;
    ListNode *head;
};
 
/**
 * Your Solution object will be instantiated and called as such:
 * Solution obj = new Solution(head);
 * int param_1 = obj.getRandom();
 */

383. 赎金信

class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        
        map<char,int> a;
        for(int i=0;i<magazine.size();i++)
            if(a.find(magazine[i])==a.end())
                a.insert(pair<char,int>(magazine[i],1));
            else a.find(magazine[i])->second++;
        
        for(int i=0;i<ransomNote.size();i++)
            if(a.find(ransomNote[i])==a.end())
                return false;
            else
            {
                if(a.find(ransomNote[i])->second<=0)
                    return false;                
                a.find(ransomNote[i])->second--; 
            }
        return true;
    }
};

384. 打乱数组

class Solution {
 public:
  Solution(vector<int> nums) : origin(nums) {}

  /** Resets the array to its original configuration and return it. */
  vector<int> reset() { return origin; }

  /** Returns a random shuffling of the array. */
  vector<int> shuffle() {
    vector<int> res(origin);
    int len = res.size();
    for(int i = 0; i < res.size(); ++i){
      int random = rand() % len;
      int tmp = res[random];
      res[random] = res[--len];
      res[len] = tmp;
    }
    return res;
  }

 private:
  vector<int> origin;
};

/**
 * Your Solution object will be instantiated and called as such:
 * Solution obj = new Solution(nums);
 * vector<int> param_1 = obj.reset();
 * vector<int> param_2 = obj.shuffle();
 */

385. 迷你语法分析器

/**
 * // This is the interface that allows for creating nested lists.
 * // You should not implement it, or speculate about its implementation
 * class NestedInteger {
 *   public:
 *     // Constructor initializes an empty nested list.
 *     NestedInteger();
 *
 *     // Constructor initializes a single integer.
 *     NestedInteger(int value);
 *
 *     // Return true if this NestedInteger holds a single integer, rather than a nested list.
 *     bool isInteger() const;
 *
 *     // Return the single integer that this NestedInteger holds, if it holds a single integer
 *     // The result is undefined if this NestedInteger holds a nested list
 *     int getInteger() const;
 *
 *     // Set this NestedInteger to hold a single integer.
 *     void setInteger(int value);
 *
 *     // Set this NestedInteger to hold a nested list and adds a nested integer to it.
 *     void add(const NestedInteger &ni);
 *
 *     // Return the nested list that this NestedInteger holds, if it holds a nested list
 *     // The result is undefined if this NestedInteger holds a single integer
 *     const vector<NestedInteger> &getList() const;
 * };
 */
class Solution {
public:
    NestedInteger deserialize(string s) {
        
        vector<int> a(1,0);        
        return sum(s,a);        
    }
    
    NestedInteger sum(string s,vector<int>& a)
    {
        NestedInteger k;
        vector<int> b;
        int p=0,w=1;
        bool j=false;
        
        if(s[a[0]]=='['&&a[0]==0)
            a[0]+=1;
        
        for(int i=a[0];i<s.size();i++)
        {
            if(s[i]=='[')
            {
                a[0]=i+1;
                NestedInteger p=sum(s,a);
                k.add(p);
                i=a[0];
            }
            while(i<s.size()&&(s[i]>='0'&&s[i]<='9'||s[i]=='-'))
            {
                if(s[i]=='-')
                    w=-1;
                else p=10*p+(s[i]-'0')*w;
                i++;
                j=true;
            }
            if(j)
            {
                if(i>=s.size())
                    k.setInteger(p);
                else k.add(p);
                p=0;   
                w=1;
                j=false;
            }
            if(i<s.size()&&s[i]==']')
            {
                a[0]=i+1;
                return k;                
            }

        }     
        return k;
    }
    
};

386. 字典序排数

class Solution {
public:
    vector<int> lexicalOrder(int n) {
        
        vector<int> a;
        lexi(n,a,1);
        return a;
    }
    
    void lexi(int n,vector<int>& a,int k) {    
        
        if(k>n)
            return ;
        
        for(int i=0;i<=9;i++)
        {
            if(k+i==10&&k==1)
                break;
            a.push_back(k+i);
            lexi(n,a,(k+i)*10);
            if(k+i+1>n)
                break;
        }    
    }
};

387. 字符串中的第一个唯一字符

class Solution {
public:
    int firstUniqChar(string s) {
        unordered_map<char, int> m;
        for (char c : s) ++m[c];
        for (int i = 0; i < s.size(); ++i) {
            if (m[s[i]] == 1) return i;
        }
        return -1;
    }
};

388. 文件的最长绝对路径

class Solution {
public:
    int lengthLongestPath(string input) {
        int res = 0, n = input.size(), level = 0;
        unordered_map<int, int> m {{0, 0}};
        for (int i = 0; i < n; ++i) {
            int start = i;
            while (i < n && input[i] != '\n' && input[i] != '\t') ++i;
            if (i >= n || input[i] == '\n') {
                string t = input.substr(start, i - start);
                if (t.find('.') != string::npos) {
                    res = max(res, m[level] + (int)t.size());
                } else {
                    ++level;
                    m[level] = m[level - 1] + (int)t.size() + 1;
                }
                level = 0;
            } else {
                ++level;
            }
        }
        return res;
    }
};

389. 找不同

class Solution {
public:
    char findTheDifference(string s, string t) {
        
        sort(s.begin(),s.end());
        sort(t.begin(),t.end());        
        
        for(long long i=0;i<s.size();i++)
            if(s[i]!=t[i])
                return t[i];
        return t.back();
    }
};

390. 消除游戏

public class Solution {
    public int lastRemaining(int n) {
        //将其镜像对折为一个子问题,当前状态可以推出的下一个状态的结果,但是相反
        return n==1?1:2*(n/2 + 1 - lastRemaining(n/2));
    }
}

391.完美矩形

392. 判断子序列

class Solution {
public:
    bool isSubsequence(string s, string t) {
        
        int zuobiao=0;
        for(char i:s)
        {
            if(t.find(i,zuobiao)!=t.npos)
                zuobiao=t.find(i,zuobiao)+1;
            else return false;
        }
        return true;
    }
};

393. UTF-8 编码验证

class Solution {
public:
    bool validUtf8(vector<int>& data) {
        int count = 0;
        for(int num : data){
            if(count == 0){
                if((num>>5) == 0b110) count = 1;//2 byte
                else if((num>>4) == 0b1110) count = 2;//3 byte;
                else if((num>>3) == 0b11110) count = 3;//4 byte
                else if((num>>7) == 1) return false;//count==0, occupy one byte
            }else{
                if((num>>6)!=0b10) return false;
                count--;
            }
        }
        return count == 0;
    }
};

394. 字符串解码

class Solution {
public:
    string decodeString(string s) {
        
        vector<int> a{0};
        return digui(s,0,a);
    }
    
    string digui(string s,int k,vector<int> &a){
        
        int q=0;
        string m;
        for(int i=k;i<s.size();i++){

            if(s[i]>='0'&&s[i]<='9')
                q=10*q+s[i]-'0';
            else if(s[i]=='[')
            {
                string b=digui(s,i+1,a);
                while(q--)
                    m+=b;
                q=0;
                i=a[0];
            }
            else if(s[i]==']')
            {
                a[0]=i;
                return m;
            }
            else
                m.push_back(s[i]);
        }
        return m;
    }  
};

395. 至少有K个重复字符的最长子串

class Solution {
public:
    int longestSubstring(string s, int k) {
        return helper(s, k, 0, s.size() - 1);
    }
    int helper(string s, int k, int left, int right) {
        int len = right - left + 1;
        if (len <= 0) return 0;
        int i, j;
        int maxlen = 0;
        vector<int> count(26, 0);
        for (i = left; i <= right; i++) {
            count[s[i] - 'a']++;
        }
        for (i = left, j = left; i <= right; i++) {
            if (count[s[i] - 'a'] < k) {
                maxlen = max(maxlen, helper(s, k, j, i - 1));
                j = i + 1;
            }

        }
        if (j == left) return len;
        else return max(maxlen, helper(s, k, j, i - 1));
    }
};

396. 旋转函数

class Solution {
public:
    int maxRotateFunction(vector<int>& A) {
        
        if(A.size()==0)
            return 0;
        int max2=INT_MIN;
        
        for(int i=0;i<A.size();i++)
        {
            int max1=0,k=0;
            for(int j=i;j-i<A.size();j++)
            {
                int p=j;
                if(p>=A.size())
                    p=j-A.size();
                max1+=k*A[p];
                k++;
            }
            max2=max(max1,max2);
        }
        return max2;
    }
};

397. 整数替换

class Solution {
public:
    int integerReplacement(int n) {
        if(n==1){
            return 0;                           
        }
        if(n%2==0){
            return integerReplacement(n/2)+1;    
        }
        else{                                    
            if(n==INT_MAX){
                return integerReplacement(n-1);              
            }
            return min(integerReplacement(n-1)+1,integerReplacement(n+1)+1);  
        }
    }
};

398. 随机数索引

class Solution {
public:
    
    vector<int> a;
    map<int,int> b;
    Solution(vector<int> nums) {
        a=nums;
        for(int i=0;i<nums.size();i++)
            if(b.find(nums[i])==b.end())
                b.insert(pair<int,int>(nums[i],1));
            else b.find(nums[i])->second++;
    }
    
    int pick(int target) {
        
        int k=rand()%b.find(target)->second+1;
        for(int i=0;i<a.size();i++)
            if(a[i]==target)
                if(!(--k))
                    return i; 
    }
};
/**
 * Your Solution object will be instantiated and called as such:
 * Solution obj = new Solution(nums);
 * int param_1 = obj.pick(target);
 */

399. 除法求值

400. 第N个数字(不会)

class Solution {
public:
    int findNthDigit(int n) {
        int len = 1, base = 1;
        while(n>9L*base*len){
            n -= 9*base*len;
            len++;
            base *= 10;
        }
        int curNum = (n-1)/len + base, digit = 0;
        for(int i=(n-1)%len;i<len;++i){
            digit = curNum%10;
            curNum /= 10;
        }
        return digit;
    }
};
class Solution {
public:
    int findNthDigit(int n) {
        
        int i=1,j=1,k=0,q=0;
        while(k+9*i*j<n)
        {
            k=k+9*i*j;
            q=q+9*i;
            j++;
            i=10*i;
        }
        int p=n-k;
        
        return p%j==0?(q+p/j)%10:int((q+p/j+1)/pow(10,j-1-p%j))%10;
    }
};

401. 二进制手表

402. 移掉K位数字(超时)

class Solution {
public:
    string removeKdigits(string num, int k) {

        return digui(num,k,0,0);
    }
    
    string digui(string num, int k,int p,int q){
        
        if(q>k)
            return num;
        if(q)
            num.erase(num.begin()+p);
        if(num.size()==0)
            return "0";
        
        int b=INT_MAX;
        for(int i=0;i<num.size();i++)
            b=min(b,atoi(digui(num,k,i,q+1).c_str()));
        
        return to_string(b);
    }
};
class Solution {
public:
 string removeKdigits(string num, int k) {
        int n = num.size(),top = 0,count = 0;  //count用来记录删除的次数
        if(k==n) return "0";  //如果k等于num的长度则直接返回"0"
        for(int i = 0;i<n;i++)
        {
            while(top>0&&num[top-1]>num[i]&&count<k)  //如果前一个数字比当前的数字大,则top又回到前一个数的位置
            {
                top--;
                count++;
            }
            num[top++] = num[i];
        }
        //上面的循环操作结束后会存在两种情况,1:通过上面的循环操作已经把k个数都删完了。2:通过上面的循环操作还没把k个数全部删完
        top = min(top,n-k);  //情况1则top = top;情况2则top = n-k;(top表示字符串最后一位的下一位)
        int i = 0;
        for(;i<top;i++)    //把前面有0的去除
            if(num[i]!='0') break;
        if(i==top) return "0";  //剩下的全部为零
        string res = "";
        for(;i<top;i++)
            res+=num[i];
        return res;
    }

};

404. 左叶子之和

/**
 * 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:
    int sumOfLeftLeaves(TreeNode* root) {
        queue<TreeNode*> q;
        q.push(root);
        int sum = 0;
        while(!q.empty()){
            TreeNode* temp = q.front();
            q.pop();
            if(temp == NULL) break;
            if(temp->left) {
                q.push(temp->left);
                if(temp->left->left == NULL && temp->left->right == NULL) sum += temp->left->val;
            }
            if(temp->right) q.push(temp->right);
        }
        return sum;
    }

};

405. 数字转换为十六进制数

409. 最长回文串

class Solution {
public:
    int longestPalindrome(string s) {
        
        map<char,int> a;
        bool k=false;
        for(char b:s)
        {
            if(a.find(b)==a.end())
                a.insert(pair<char,int>(b,1));
            else a.find(b)->second++;
        }
        int sum=0;
        for(map<char,int>::iterator i=a.begin();i!=a.end();i++)
        {
            if(i->second%2==0)
                sum+=i->second;
            else 
            {
                if(i->second/2!=0)
                    sum+=(i->second/2)*2;
                k=true;
            }
        }
        return k?++sum:sum;
    }
};

412. Fizz Buzz

class Solution {
public:
    vector<string> fizzBuzz(int n) {
        
        vector<string> a{"Fizz","Buzz","FizzBuzz"};
        vector<string> b;
        
        for(int i=1;i<=n;i++)
        {
            if(!(i%3)||!(i%5))
            {
                if(!(i%3)&&!(i%5))
                    b.push_back(a[2]);
                else if(!(i%3))
                    b.push_back(a[0]);
                else b.push_back(a[1]);
            }
            else
                b.push_back(to_string(i));
        }
        return b;
        
    }
};

413. 等差数列划分(超时)

class Solution {
public:
    int numberOfArithmeticSlices(vector<int>& A) {
        
        int sum=0;
        for(int i=0;i+1<A.size();i++)
        {
            int d=A[i]-A[i+1],k=1;
            for(int j=i;j+1<A.size();j++)
            {
                if(d==A[j]-A[j+1])
                {
                    k++;
                    if(k>=3)
                        sum++;
                }
                else
                {
                    d=A[j]-A[j+1];
                    k=1;
                }
            }
        }
        return sum;
    }
};
class Solution {
public:
    int numberOfArithmeticSlices(vector<int>& A) {
        
        int sum = 0,count = 0;
        
        for(int i=2;i<A.size();i++){
            if(A[i] - A[i-1] == A[i-1] - A[i-2]){
                count++;
                sum += count;
            }else{
                count = 0;
            }
        }
        return sum;
    }
};

414. 第三大的数

class Solution {
public:
    int thirdMax(vector<int>& nums) {
        set<int>s;
        for(int i=0;i<nums.size();i++){
            s.insert(nums[i]);
            if(s.size()>3){
                s.erase(s.begin());
            }                               
        }
        return s.size()==3?*s.begin():*s.rbegin();
    }
};

415. 字符串相加

class Solution {
public:
    string addStrings(string num1, string num2) {
        
        
        int i=0,k=0,d=0;
        string s;
        reverse(num1.begin(),num1.end());
        reverse(num2.begin(),num2.end());        
        while(i<=max(num1.size(),num2.size())) 
        {
            int c;
            char a='0',b='0';
            if(i<num1.size())
                a=num1[i];
            if(i<num2.size())
                b=num2[i];
            c=d+a-'0'+b-'0';
            d=c/10;
            c%=10;
            s+=to_string(c);
            i++;
        }
        if(s.back()=='0')
            s.erase(s.begin()+s.size()-1);
        reverse(s.begin(),s.end());         
        return s; 
    }
};

416. 分割等和子集

421. 数组中两个数的最大异或值

class Solution {
public:
    int findMaximumXOR(vector<int>& nums) {
        int max = 0, mask = 0;
        for (int i = 31; i >= 0; i--) {
            set<int> set;
            mask = mask | (1 << i);
            for (int num : nums) {
                set.insert(num & mask);
            }
            int temp = max | (1 << i);
            for (int element : set) {
                if (set.find(element ^ temp) != set.end()) {
                    max = temp;
                    break;
                }
            }
        }
        return max;
    }
};

423. 从英文中重建数字

class Solution {
public:
    string originalDigits(string s) 
    {
        int a[10]={0};
        int n=s.length();
        map<char,int> dic;
        for(int i=0;i<n;i++)
        {
            if(dic.count(s[i])<1)
            {
                dic.insert(pair<char,int>(s[i],1));
            }
            else
            {
                dic[s[i]]+=1;
            }
        }
        for(int i=0;i<n;i++)
        {
            if(s[i]=='z')
            {
                a[0]++;
                dic['e']--;
                dic['r']--;
                dic['o']--;
            }
            if(s[i]=='w')
            {
                a[2]++;
                dic['t']--;
                dic['o']--;
            }
            if(s[i]=='u')
            {
                a[4]++;
                dic['f']--;
                dic['o']--;
                dic['r']--;
            }
            if(s[i]=='x')
            {
                a[6]++;
                dic['s']--;
                dic['i']--;
            }
            if(s[i]=='g')
            {
                a[8]++;
                dic['e']--;
                dic['i']--;
                dic['h']--;
                dic['t']--;
            }
        }
        a[1]=dic['o'];
        a[3]=dic['t'];
        a[5]=dic['f'];
        a[7]=dic['s'];
        a[9]=dic['i']-dic['f'];
        string res;
        for(int i=0;i<10;i++)
        {
            //for(int j=0;j<a[i];j++)
            //{
            //    res.push_back(i+'0');
            //}
            res.insert(res.end(),a[i],i+'0');
        }
        return res;
    }
};

424. 替换后的最长重复字符

class Solution {
public:
    int characterReplacement(string s, int k) {
        int res = 0, maxCnt = 0, start = 0;
        vector<int> counts(26, 0);
        for (int i = 0; i < s.size(); ++i) {
            maxCnt = max(maxCnt, ++counts[s[i] - 'A']);
            while (i - start + 1 - maxCnt > k) {
                --counts[s[start] - 'A'];
                ++start;
            }
            res = max(res, i - start + 1);
        }
        return res;
    }
};

430. 扁平化多级双向链表

/*
// Definition for a Node.
class Node {
public:
    int val = NULL;
    Node* prev = NULL;
    Node* next = NULL;
    Node* child = NULL;

    Node() {}

    Node(int _val, Node* _prev, Node* _next, Node* _child) {
        val = _val;
        prev = _prev;
        next = _next;
        child = _child;
    }
};
*/
class Solution {
public:
    Node* flatten(Node* head) {
        
        Node *p= head;
        while(p)
        {
            Node *q;
            if(p->child)
            {
                q=p->next;
                Node *m=flatten(p->child); 
                p->child=NULL;
                p->next=m;
                m->prev=p;
                while(m->next)
                    m=m->next;
                m->next=q;
                if(q)
                    q->prev=m;
            }
            p=p->next; 
        }
         return head;   
    }
};

433. 最小基因变化

434. 字符串中的单词数

class Solution {
public:
    int countSegments(string s) {
        
        int num=0;
        
        for(int i=0;i<s.size();i++)
        {
            if(s[i]!=' ')
            {
                num++;
            while(i<s.size()&&s[i]!=' ')
                i++;                
            }            
        }
        return num;
    }
};

435. 无重叠区间

436. 寻找右区间

437. 路径总和 III

/**
 * 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:
    int pathSum(TreeNode* root, int sum) {
        if(root == NULL) {
            return 0;
        }
        int res = 0;
        res += dfs(root, sum);
        res += pathSum(root->left, sum);
        res += pathSum(root->right, sum);
        return res;
    }
private:
    int dfs(TreeNode* root, int num) {
        if(root == NULL) {
            return 0;
        }
        int res = 0;
        if(root->val == num) {
            res += 1;
        }
        res += dfs(root->left, num - root->val);
        res += dfs(root->right, num - root->val);
        return res;
    }
};

438. 找到字符串中所有字母异位词

class Solution {
private:
    vector<int>result;
public:
    vector<int> findAnagrams(string s, string p) 
    {
        if(s.size()==0||p.size()==0)
            return result;
        vector<int>vs(26,0);//用数组来创建两个哈希表;
        vector<int>vp(26,0);
        //主要的内容;
        for(char c:p)//遍历p字符串;结果存入到vp中;存入的是数字;
            vp[c-'a']++;
        //主要的算法内容;
        for(int i=0;i<s.size();i++)//遍历给定的要查找的字符串;
        {
            
            if(i>=p.size())//如果说此时的下标大于滑动窗口的长度;
                vs[s[i-p.size()]-'a']--;
            vs[s[i]-'a']++;//将当前的字符加入到滑动窗口中;
            
            if(vs==vp)//注意这里只比较数组的内容并不需要比较顺序;
                result.push_back(i-p.size()+1);
        }
        return result;
        
        
    }
};

440. 字典序的第K小数字 (超时)

class Solution {
public:
    int findKthNumber(int n, int k) {
        
        vector<long> a(1,k);
        vector<long> b(1,0);
        digui(n,a,1,k,b);
        return b[0];
    }
    
    void digui(int n,vector<long> &a,long p,int k,vector<long> &b){

        if(p>n)
            return ;
        
        for(int i=0;i<=9;i++)
        {
            if(p+i==10&&p!=10)
                break;
            a[0]--;
            b[0]=p+i;
            if(a[0]==0)
                return ;
            digui(n,a,(p+i)*10,k,b);
            if(a[0]==0)
                return ;
            if(p+i+1>n)
                break;
        }
    }
};

441. 排列硬币

class Solution {
public:
    int arrangeCoins(int n) {
        
        int i=1;
        while(n>=i)
        {
            n-=i;
            i++;
        }
        return --i;
    }
};

442. 数组中重复的数据

class Solution {
public:
    vector<int> findDuplicates(vector<int>& nums) {
        vector<int> res;
        for(int i=0;i<nums.size();++i){
            int idx=abs(nums[i])-1;
            if(nums[idx]<0) res.push_back(idx+1);
            nums[idx]=-nums[idx];
        }
        return res;
    }
};

443. 压缩字符串

class Solution {
public:
    int compress(vector<char>& chars) {
        
        char a=chars[0];
        int i=1;
        while(i<chars.size())
        {
            int k=1,p=0;
            while(i<chars.size()&&a==chars[i])
            {
                chars.erase(chars.begin()+i);
                k++;
            }
            if(i<chars.size())
                a=chars[i];
            if(k!=1)
            {
                while(k)
                {
                    chars.insert(chars.begin()+i,k%10+'0');
                    k/=10;
                    p++;
                }
            }
            i=i+p+1;
        }
        return chars.size();
    }
};

445. 两数相加 II

/**
 * 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 *dummy=new ListNode(0);
        if(!l1)return l2;
        if(!l2)return l1;
        ListNode *cur=dummy;
        
        ListNode *p1=l1;
        ListNode *p2=l2;
        stack<int>stk1,stk2;
        while(p1)
        {
            stk1.push(p1->val);
            p1=p1->next;
        }
        while(p2)
        {
            stk2.push(p2->val);
            p2=p2->next;
        }
        int sum=0;
        int overload=0;
        while(stk1.size()||stk2.size()||sum)
        {
            if(stk1.size())
            {
                sum+=stk1.top();
                stk1.pop();
            }
            if(stk2.size())
            {
                sum+=stk2.top();
                stk2.pop();
            }
            ListNode *temp=new ListNode(sum%10);
            sum/=10;
            overload=sum;
            temp->next=cur->next;
            cur->next=temp;
            //cur=cur->next;
            
        }
        return dummy->next;
    }
};

446. 等差数列划分 II - 子序列

447. 回旋镖的数量

class Solution {
public:
    int numberOfBoomerangs(vector<pair<int, int>>& points)
    {
        int res = 0;
        for (int i = 0; i < points.size(); ++i)
        {
            unordered_map<int, int> m;
            for (int j = 0; j < points.size(); ++j)
            {
                int a = points[i].first - points[j].first;
                int b = points[i].second - points[j].second;
                ++m[a * a + b * b];
            }
            for (auto it = m.begin(); it != m.end(); ++it)
            {
                res += it->second * (it->second - 1);
            }
        }
        return res;
    }
};

448. 找到所有数组中消失的数字

class Solution {
public:
    vector<int> findDisappearedNumbers(vector<int>& nums) {
        vector<int> res;
        for (int i = 0; i < nums.size(); ++i) {
            int idx = abs(nums[i]) - 1;
            nums[idx] = (nums[idx] > 0) ? -nums[idx] : nums[idx];
        }
        for (int i = 0; i < nums.size(); ++i) {
            if (nums[i] > 0) {
                res.push_back(i + 1);
            }
        }
        return res;
    }
};

479. 最大回文数乘积

class Solution {
public:
    int largestPalindrome(int n) {
        int upper = pow(10, n) - 1, lower = upper / 10;
        for (int i = upper; i > lower; --i) {
            string t = to_string(i);
            long p = stol(t + string(t.rbegin(), t.rend()));
            for (long j = upper; j * j > p; --j) {
                if (p % j == 0) return p % 1337;
            }
        }
        return 9;
    }
};

482. 密钥格式化

class Solution {
public:
    string licenseKeyFormatting(string S, int K) {
        
        string s,p="-";
        int sum=0;
        
        for(int i=S.size()-1;i>=0;i--)
        {
            if(S[i]=='-')
                continue;                   
            
            if((S[i]>='A'&&S[i]<='Z')||(S[i]>='0'&&S[i]<='9'))
                s+=S[i];
            else s.push_back(S[i]-32);
            sum++;
            if(sum==K)
            {
                s+=p;
                sum=0;                
            }
        }
        if(s.back()=='-')
            s.erase(s.begin()+s.size()-1);
        reverse(s.begin(),s.end());
        return s;
    }
};

注:题目较简单,从后到前遍历一遍后再翻转即可,时间复杂度O(n),空间复杂度O(n)。超过99.56%,用时20min(理解题意理解错了。。除了第一个组合我以为第一个组合不用改,结果空在那想。。)。

485. 最大连续1的个数

class Solution {
public:
    int findMaxConsecutiveOnes(vector<int>& nums) {
        
        int max=0,sum=0;
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]==0)
                sum=0;
            else
            {
                sum++;     
                max=max>sum?max:sum;
            } 
        }
        return max;
    }
};

注:题目较简单,从前到后遍历一遍即可,时间复杂度O(n),空间复杂度O(1)。超过95.24%,用时5min。

492. 构造矩形

class Solution {
public:
    vector<int> constructRectangle(int area) {
        vector<int> res;
        int x = sqrt(area);
        for(int i=x;i<=area;i++){
            if(area%i==0&&i>=area/i){
                res.push_back(i);
                res.push_back(area/i);
                break;
            }
        }
        return res;
    }
};

496. 下一个更大元素 I

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
        
        vector<int> a;
        
        for(int i=0;i<findNums.size();i++)
        {
            for(int j=0;j<nums.size();j++)
            {
                if(nums[j]==findNums[i])
                    for(int k=j;k<nums.size();k++)
                    {
                        if(nums[k]>nums[j])
                        {
                            a.push_back(nums[k]);
                            break;
                        }
                        if(k==nums.size()-1)
                            a.push_back(-1);
                    }
            }

        }
        return a;
    }
};

500. 键盘行

class Solution {
public:
    vector<string> findWords(vector<string>& words) {
        vector<string> res;
        unordered_set<char> row1 {'q','w','e','r','t','y','u','i','o','p','Q','W','E','R','T','Y','U','I','O','P'};
        unordered_set<char> row2{'a','s','d','f','g','h','j','k','l','A','S','D','F','G','H','J','K','L'};
        unordered_set<char> row3{'z','x','c','v','b','n','m','Z','X','C','V','B','N','M'};
        for(string word : words) {
            int a = 0;
            int b = 0;
            int c = 0;
            for(char ch : word) {
                if(row1.count(ch)) a = 1;
                else if(row2.count(ch)) b = 1;
                else if(row3.count(ch)) c = 1;
                
                if(a + b + c > 1) break;    
            }
            if(a + b + c == 1) res.push_back(word);
        }
        
        return res;
    }
};

501. 二叉搜索树中的众数

/**
 * 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> res;
        int mx = 0, cnt = 1;
    vector<int> findMode(TreeNode* root) {
        TreeNode* pre = NULL;
        inorder(root, pre);
        return res;
    }
    void inorder(TreeNode* node, TreeNode*& pre) {
        if(!node) {
            return ;
        }
        inorder(node->left, pre);
        if(pre) {
            cnt = (node->val == pre->val) ? cnt + 1 : 1;
        }
        if(cnt >= mx) {
            if(cnt > mx) {
                res.clear();
            }
            res.push_back(node->val);
            mx = cnt;
        }
        pre = node;
        inorder(node->right, pre);
    }
};

503. 下一个更大元素 II

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        
        vector<int> a;
        for(int i=0;i<nums.size();i++)
        {
            for(int j=i+1;j-i-1<nums.size();j++)
            {
                int p=j;
                if(j>=nums.size())
                    p=j-nums.size();
                if(nums[p]>nums[i])
                {
                    a.push_back(nums[p]);
                    break;
                }
                if(p==i)
                    a.push_back(-1);
            }
        }
        return a;
    }
};

504. 七进制数

class Solution {
public:
    string convertToBase7(int num) {
        
        string k;
        if(num==0)
            return "0";
        int p=num>0?1:-1;
        num=abs(num);
        while(num)
        {
            k+=to_string(num%7);
            num/=7;
        }
        if(p==-1)
            k+="-";
        reverse(k.begin(),k.end());        
        return k;
    }
};

506. 相对名次

class Solution {
public:
    vector<string> findRelativeRanks(vector<int>& nums) {
        
        vector<int> a=nums;
        vector<string> b(nums.size(),"0"),d{"Gold Medal", "Silver Medal", "Bronze Medal"};
        int k=1;
        sort(a.begin(),a.end());
        map<int,int> c;
        for(int i=0;i<nums.size();i++)
            c[nums[i]]=i;
        
        for(int i=nums.size()-1;i>=0;i--)
        {
            if(k<4)
            {
                b[c.find(a[i])->second]=d[nums.size()-i-1];
            }
            else b[c.find(a[i])->second]=to_string(k);
            k++;
        }
        return b;
    }
};

猜你喜欢

转载自blog.csdn.net/Rrui7739/article/details/84111246