Rrui的Leetcode算法刷題筆記(六)

注:本頁有大量的鎖定題,由於本人非常窮,所以本頁的題非常少。

268. Missing Number

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        
        int k=INT_MAX;
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]==0)
                continue;
            nums[abs(nums[i])-1]=-abs(nums[abs(nums[i])-1]);
            if(nums[abs(nums[i])-1]==0)
                k=abs(nums[i])-1;
        }
        if(k!=INT_MAX)
            nums[k]=-1;    
        
        for(int i=0;i<nums.size();i++)
            if(nums[i]>=0)
                return i+1;
        return 0;  
    }
};

注:簡單題,如果數字存在的話則對應下標的那個數標爲負數,特殊情況是0,需要特殊考慮。faster than 51.79%。

273. Integer to English Words

 

注:困難題,。faster than XX%。

274. H-Index/275. H-Index II

class Solution {
public:
    int hIndex(vector<int>& citations) {
         
        if(citations.size()==0)
            return 0;
        
        sort(citations.begin(),citations.end());
        int max=INT_MIN,p=1;
        
        for(int i=citations.size()-1;i>=0;i--)
        {
            if(citations[i]>=p)
                max=p>=max?p:max;
            p++;
        }
        return max==INT_MIN?0:max;
    }
};

注:中等題,可以用二分法解決,當時只想到排序,沒有想到還可以繼續簡化時間。faster than 25.58%。

278. First Bad Version

// Forward declaration of isBadVersion API.
bool isBadVersion(int version);

class Solution {
public:
    int firstBadVersion(int n) {
        
        long long low=1,high=n,mid;
        
        while(low<=high)
        {
            mid=(low+high)/2;
            if(!isBadVersion(mid))
                low=mid+1;
            else high=mid-1;
        }
        return low;
    }
};

注:簡單題,簡單的考察二分法,這裏需要使用長整型,因爲測試用例太大相加會越界。faster than 100%。

279. Perfect Squares

class Solution {
public:
    int numSquares(int n) {
        
        vector<int> a(n+1,INT_MAX);
        a[0]=1;
        
        for(int i=1;i<=n;i++)
        {
            int k=int(sqrt(i));
            if(k*k==i)
                a[i]=1;
            else
                for(int j=1;j<=i/2;j++)
                    a[i]=min(a[i-j]+a[j],a[i]);
        }
        return a[n];
    }
};

注:中等題,動態規劃題。faster than 2.06%。

282. Expression Add Operators

 

注:困難題,如果數字存在的話則對應下標的那個數標爲負數,特殊情況是0,需要特殊考慮。faster than 51.79%。

283. Move Zeroes

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        
        int k=0;
        
        for(int i=0;i<nums.size();i++)
            if(nums[i]==0)
            {
                nums.erase(nums.begin()+i);
                i--;
                k++;
            }
        while(k--)
            nums.push_back(0);
        
    }
};

注:簡單題,雙指針法是最優解,我直接刪除添加了。faster than 93.87%。

284. Peeking Iterator

 

注:中等題,如果數字存在的話則對應下標的那個數標爲負數,特殊情況是0,需要特殊考慮。faster than 51.79%。

287. Find the Duplicate Number

 

注:中等題,如果數字存在的話則對應下標的那個數標爲負數,特殊情況是0,需要特殊考慮。faster than 51.79%。

289. Game of Life

 

注:中等題,如果數字存在的話則對應下標的那個數標爲負數,特殊情況是0,需要特殊考慮。faster than 51.79%。

290. Word Pattern

class Solution {
public:
    bool wordPattern(string pattern, string str) {
        unordered_map<char,int> m1;
        unordered_map<string,int> m2;
        istringstream in(str);
        int i = 0;
        for(string word;in>>word;++i){
            if(m1.find(pattern[i])!=m1.end()||m2.find(word)!=m2.end()){
                if(m1[pattern[i]]!=m2[word]){
                    return false;
                }
            }else{
                m1[pattern[i]] = m2[word] = i+1;
            }
        }
        return i==pattern.size();
    }
};

注:簡單題,用倆map即可求解,代碼懶得寫,抄來的。faster than 100.00%。

292. Nim Game

class Solution {
public:
    bool canWinNim(int n) {
        if (n % 4 == 0)
            return false;
        return true;
    }
};

注:簡單題,不解釋,浪費時間。faster than 100.00%。

295. Find Median from Data Stream

https://blog.csdn.net/qq508618087/article/details/51014047

https://blog.csdn.net/u014673347/article/details/50633866

注:困難題,需要用到堆,同時維護大頂堆和小頂堆。faster than XX%。

297. Serialize and Deserialize Binary Tree

 

注:困難題,需要用到堆,同時維護大頂堆和小頂堆。faster than XX%。

299. Bulls and Cows

class Solution {
public:
    string getHint(string secret, string guess) {
        
        int a=0,b=0;
        map<char,int> c;
        string s;
        
        for(char a:secret)
            c[a]++;
        
        for(int i=0;i<guess.size();i++)
            if(secret[i]==guess[i])
            {
                a++;
                c[secret[i]]--;
            }

        for(int i=0;i<guess.size();i++)
            if(secret[i]!=guess[i]&&c.find(guess[i])!=c.end()&&c[guess[i]]>0)
            {
                b++;
                c[guess[i]]--;
            }
     
        s+=to_string(a)+'A';
        s+=to_string(b)+'B';
        return s;
    }
};

注:中等題,兩編遍歷就好了。faster than 58.73%。

300. Longest Increasing Subsequence

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        
        if(nums.size()==0)
            return 0;
        vector<int> a(nums.size(),1);
        int k=1;
        for(int i=nums.size()-2;i>=0;i--)
        {
            for(int j=i+1;j<nums.size();j++)
            {
                if(nums[j]>nums[i])
                {
                    a[i]=max(a[i],a[j]+1);
                    k=max(a[i],k);
                }    
            }
        }
        return k;
    }
};

注:中等題,我想到的是動態規劃方法,還有一更變態的動態規劃+二分搜索,在內循環直接找第一個大於nums[i]的數,喪心病狂。faster than 58.73%。

306. Additive Number

 

注:中等題,兩編遍歷就好了。faster than 58.73%。

 

 

312. Burst Balloons

 

注:中等題,兩編遍歷就好了。faster than 58.73%。

313. Super Ugly Number

 

注:中等題,兩編遍歷就好了。faster than 58.73%。

315. Count of Smaller Numbers After Self

class Solution {
public:     
    vector<int> countSmaller(vector<int>& nums) {
        vector<int> counts(nums.size());
        vector<int> trans;
        if (nums.size() == 0)
            return counts;
        trans.push_back(nums[nums.size() - 1]);
        for (int i = nums.size() - 2; i >= 0; i--) {
            // 這裏二分我們用STL裏的就好了
            auto it = lower_bound(trans.begin(), trans.end(), nums[i]);
            counts[i] = it - trans.begin();
            trans.insert(it, nums[i]);
        }
        return counts;
    }
};

注:困難題,用二分查找法。faster than XX%。

316. Remove Duplicate Letters

 

注:困難題,如果數字存在的話則對應下標的那個數標爲負數,特殊情況是0,需要特殊考慮。faster than 51.79%。

 

Rrui的Leetcode算法刷題筆記(七)鏈接如下:

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

 

 

279. 完全平方數

class Solution {
public:
    int numSquares(int n) {
        vector<int> dp(n + 1, INT_MAX);
        for(int i = 1; i * i <= n; i++)
            dp[i * i] = 1;
        for(int i = 1; i <= n; i++)
            for(int j = 1; j * j < i; j++)
                dp[i] = min(dp[i], dp[i - j * j] + 1);
        return dp[n];
    }
};

287. 尋找重複數

class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        if(nums.empty())
            return 0;
        int low = 1, high = nums.size()-1;
        while(low<high)
        {
            int mid = (low+high)/2;//找到(1,n)的中間的數
            int count = 0;
            for(int i=0;i<nums.size();++i)
            {
                if(nums[i] <= mid)//找到數組中比中間的數小的所有數的個數
                    count++;
            }
            if(count <= mid)//如果個數小於中間的數,則重複的數在數組右邊,反之在左邊
                low = mid+1;
            else
                high = mid;
        }
        return low;
    }
};

 

307. 區域和檢索 - 數組可修改

class NumArray {
public:
    
    vector<int> a;
        
    NumArray(vector<int> nums) {
        a=nums;
    }
    
    void update(int i, int val) {
        a[i]=val;
    }
    
    int sumRange(int i, int j) {
        int sum=0;
        for(int k=i;k<=j;k++)
            sum+=a[k];
        return sum;
    }
};

/**
 * Your NumArray object will be instantiated and called as such:
 * NumArray obj = new NumArray(nums);
 * obj.update(i,val);
 * int param_2 = obj.sumRange(i,j);
 */

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章