思路:
遍历一遍记录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;
else
nums[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;
}
};