一.删除有序数组中的重复项
思路:两个指针,一个left,一个right,如果left和right数组元素相同,right就前进一个,若不同,left前进一个(因为前面若有重复元素,left前进一格后所在元素就是需要被覆盖的重复元素)并且将right此时的数组值赋予left所在数组,直到right走到最后,返回left的值。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int left=0;
int right=1;
if(nums.size()==0){
return 0;
}
else{
while(right<nums.size()){
if(nums[left]==nums[right]){
right++;
}
else{
left++;
nums[left]=nums[right];
}
}
}
return left+1;
}
};
2.重复项出现两次
思路:两个指针(left和right)left代表已经检查过的数组元素,right代表将要检查的数组元素,right所在的元素要与(left-2)元素对比【因为要求可以保留两个相同的】如果相同则无法保留,如果不同就放置在left的位置,left位移下一个。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size()<=2){
return nums.size();
}
int left=2,right=2;
while(right<nums.size()){
if(nums[left-2]!=nums[right]){
nums[left]=nums[right];
left++;
}
right++;
}
return left;
}
};
三.多数元素
利用哈希表存储,最后找出大于n/2的:
class Solution {
public:
int majorityElement(vector<int>& nums) {
unordered_map <int,int> hashmap;
int res=0;
for(int n:nums){
hashmap[n]++;
if(hashmap[n]>nums.size()/2){
res=n;
}
}
return res;
}
};