7.找出不重复的元素个数
题目:
一个数据先递增再递减,找出数组不重复的个数。不能使用额外空间,复杂度o(n)
思路:
方法1:首先用快排进行1排序,然后中不同
方法二:找到最大的位置然后,从最大的位置向两边移动(双指针)
谁大谁移动 左右指针相等 那么同时移动
代码:
class Solution {
private:
int _maximumSwap(vector<int> &numbers)
{
//首先找到最大值
int maxVaule=INT_MIN;
int maxIndex=0;
for(int i=0;i<numbers.size();i++)
{
if(max(maxVaule,numbers[i])<=numbers[i])
// if(numbers[i]>=maxVaule)
{
// cout<<"maxVaule="<<maxVaule<<"numbers[i]"<<numbers[i]<<endl;
// cout<<"当前索引值index="<<i<<"当前值是"<<numbers[i]<<endl;
maxVaule=numbers[i];
maxIndex=i;
}
}
cout<<"maxIndex="<<maxIndex<<endl;
int left=maxIndex;
int right=maxIndex+1;
int ret=0;
while(left>=0&&right<=numbers.size()-1)
{
ret++;
if(numbers[left]>numbers[right])
{
while(left>=1&&numbers[left]==numbers[left-1])
{
left--;
}
left--;
}else if(numbers[left]<numbers[right])
{
while(right<=numbers.size()-2&&numbers[right]==numbers[right+1])
{
right++;
}
right++;
}else if(numbers[left]==numbers[right])
{
while(left>=1&&numbers[left]==numbers[left-1])
{
left--;
}
left--;
while(right<=numbers.size()-2&&numbers[right]==numbers[right+1])
{
right++;
}
right++;
}
}
while(left>=0)
{
ret++;
while(left>=1&&numbers[left]==numbers[left-1])
{
left--;
}
left--;
}
while(right<=numbers.size()-1)
{
ret++;
while(right<=numbers.size()-2&&numbers[right]==numbers[right+1])
{
right++;
}
right++;
}
return ret;
}
public:
int diffNumberSum((vector<int> &numbers)
{
// vector<int> numbers{1,10,15,19,9,8,4};
// vector<int> numbers{1,2,3,3,3,4,5,5,5,4,3,2};
//首先排序法警方判定有多少个不同的数
sort(numbers.begin(),numbers.end());
if(numbers.size()==0) return 0;
int diffS=0;
for(int i=0;i<numbers.size();i++)
{
if(i>0&&numbers[i]==numbers[i-1]) continue;
diffS++;
}
cout<<"diffS1="<<diffS<<endl;
int diffs2=_maximumSwap(numbers);
cout<<"diffs2="<<diffs2<<endl;
return diffS;
}
};