思路:
遍历一遍记录0,1,2的个数,然后再遍历一次,按照0,1,2的个数修改nums即可。
class Solution
{
public:void sortColors(vector<int>& nums){int n0 = 0, n1 = 0, n2 = 0;for(int x: nums){if(x==0) n0++;else if(x==1) n1++;else n2++;}for(int i=0; i<nums.size();i++){if(i < n0)nums[i] = 0;else if(i < n0+n1)nums[i] = 1;elsenums[i] = 2;}}
};
思路:
class Solution
{
public:void nextPermutation(vector<int>& nums){int cur = nums.size()-2;while(cur>=0 && nums[cur] >= nums[cur+1]) // 前面大于后面{cur--;}if(cur < 0) // 已经是最大数组了{// sort排序为升序排序,为数组最小值sort(nums.begin(),nums.end());}// 表示找到了降序的一个位置else{int pos = nums.size()-1;while(nums[pos] <= nums[])}}
};
思路:
使用二分法解题,具体看代码。
class Solution
{
public:int findDuplicate(vector<int>& nums){int n = nums.size()-1, start = 0, end = n;while(start < end){int mid = start + (end - start) / 2; // 防止溢出int count = 0;for(int n:nums){//统计[1,mid]区间的数字个数if(n <= mid) count++;}//[1,mid]区间的数字如果大于mid,说明重复数字在区间[start,mid]中if(count > mid) end = mid;//反之重复区间在[mid+1,end]else start = mid + 1;}//当start等于mid时,返还重复数字return start;}
};