标签: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