码迷,mamicode.com
首页 > 其他好文 > 详细

第一周练习

时间:2019-04-15 21:38:56      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:for   twosum   assign   ges   递归   second   ber   次数   NPU   

167. Two Sum II - Input array is sorted
分析:简单题,双指针,如果比target大,则说明j要变小,如果比target小,说明i要变大

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        vector<int>res;
        int len=numbers.size();
        if(len<2) return res;
        int i=0,j=len-1;
        while(i<j){
            int sum=numbers[i]+numbers[j];
            if(sum<target){
                i++;
            }else if(sum>target){
                j--;
            }else{
                res.push_back(i+1);
                res.push_back(j+1);
                break;
            }
        }
        return res; 
    }
};

215. Kth Largest Element in an Array
分析:快排思想,不过递归的时候根据当前位置和k的大小关系决定在左一半区间做递归还是在右一半区间做递归,期望复杂度是O(N)

int ans=0;
class Solution {
public:
    void Kth(int left,int right,vector<int>&a,int k){
        int l=left,r=right,key=a[l];
        while(l<r){
            while(l<r&&a[r]<=key) --r;
            if(l<r) a[l++]=a[r];
            while(l<r&&key<=a[l]) l++;
            if(l<r) a[r--]=a[l];
        }
        if(l+1<k){
            Kth(l+1,right,a,k);
        }else if(l+1>k){
            Kth(left,r-1,a,k);
        }else{
            ans=key;
            return;
        }
    }
    int findKthLargest(vector<int>& nums, int k) {
        int len=nums.size();
        Kth(0,len-1,nums,k);
        return ans;
    }
};

347. Top K Frequent Elements
分析:这道题出得非常好,解法是用桶排序。首先,我们先统计原始数组中每个数出现的次数。然后我们去统计出现这个次数的元素有哪些,然后我们从小到大跑一遍出现的元素次数,同时把对应的前k个元素记录下来即可,复杂度O(N)

class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int,int>mp;
        int mx=0;
        for(auto v:nums){
            mp[v]++;
            mx=max(mx,mp[v]);
        }
        int len=nums.size()+10;
        vector<int>g[len];
        for(auto v:mp){
            g[v.second].push_back(v.first);
        }
        vector<int>res;
        int cnt=0,flag=0;
        for(int i=mx;i>=1;i--){
            if(flag) break;
            for(auto v:g[i]){
                cnt++;
                if(cnt>k){flag=1; break;}
                res.push_back(v);
            }
        }
        return res;
    }
};

75. Sort Colors
分析:用3个指针,一个负责指向当前位置,一个负责指向第一次出现1的位置,一个负责指向第一次出现2的位置。如果当前位置是0,要做2次交换,同时指向1和2的2个指针加1,如果为1,交换一次,指向2的指针移动1,如果是2,则不变。

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int len=nums.size();
        int one=0,two=0;
        for(int i=0;i<len;i++){
            if(nums[i]==2) continue;
            else if(nums[i]==1){
                swap(nums[i],nums[two]);
                two++;
            }else{
                swap(nums[i],nums[two]);
                swap(nums[two],nums[one]);
                two++;
                one++;
            }
        }
    }
};

455. Assign Cookies
分析:做法很显然,先把两个数组从小到大排序,然后如果\(s_j \geq g_i\),则指针都往后移动一个,并把统计数量加1,否则只把j往后移

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        sort(g.begin(),g.end());
        sort(s.begin(),s.end());
        int lens=s.size(),leng=g.size();
        int i=0,j=0,cnt=0;
        while(j<lens&&i<leng){
            if(s[j]>=g[i]){
                i++,j++;
                cnt++;
            }else j++;
        }
        return cnt;
    }
};

第一周练习

标签:for   twosum   assign   ges   递归   second   ber   次数   NPU   

原文地址:https://www.cnblogs.com/gzgywh/p/10713318.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!