三数之和:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> res;
int index = 0;
while( index < nums.size() ){
if( nums[index] > 0 )
break;
int bindex = index + 1;
int cindex = nums.size()-1;
while( bindex < cindex) {
if (nums[bindex] + nums[cindex] == -nums[index]) {
res.push_back({nums[index], nums[bindex], nums[cindex]});
// continue to look for other pairs
bindex = next_num_index( nums, bindex );
cindex = pre_num_index( nums, cindex);
}
else if (nums[bindex] + nums[cindex] < -nums[index])
bindex = next_num_index( nums, bindex );
else //nums[bindex] + nums[cindex] > -nums[index]
cindex = pre_num_index( nums, cindex);
}
index = next_num_index( nums , index );
}
return res;
}
private:
int next_num_index( const vector<int> &nums, int cur ){
for( int i = cur + 1; i < nums.size() ; i ++ )
if( nums[i] != nums[cur] )
return i;
return nums.size();
}
int pre_num_index( const vector<int> &nums, int cur){
for( int i = cur - 1; i >= 0 ; i -- )
if( nums[i] != nums[cur] )
return i;
return -1;
}
};
求众数:
class Solution {
public:
int majorityElement(vector<int>& nums) {
assert(nums.size() > 0);
sort(nums.begin(), nums.end());
return nums[nums.size()/2];
}
};
求缺失的第一个正数
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
for (int i = 0; i < n; i++) {
while (nums[i] != i + 1) {
if (nums[i] <= 0 || nums[i] > n || nums[i] == nums[nums[i] - 1])
break;
swap(nums[i], nums[nums[i] - 1]);
}
}
for (int i = 0; i < nums.size(); ++i)
if (nums[i] != (i + 1))
return i + 1;
return nums.size() + 1;
}
};