进阶,其他解法
数组
88. 合并两个有序数组 - 力扣(LeetCode)
1、按非递减顺序合并两个数组
从末尾开始,用while分没到两个数组头,到第一个数组头,到第二个数组头三种情况
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i=m-1,j=n-1,k=m+n-1;
while(i>=0&&j>=0){
nums1[k--]=nums1[i]>nums2[j]?nums1[i--]:nums2[j--];
}
while(i>=0){
nums1[k--]=nums1[i--];
}
while(j>=0){
nums1[k--]=nums2[j--];
}
}
};
2、移除掉某个数值的元素,无序
27. 移除元素 - 力扣(LeetCode)
借助一个新标号
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
//双指针法
int slowIndex=0;
for(int i=slowIndex;i<nums.size();i++){
if (val!=nums[i]){
nums[slowIndex++]=nums[i];//先赋值,再++
}
}
return slowIndex;
}
};
3、删除有序数组中的重复项
26. 删除有序数组中的重复项 - 力扣(LeetCode)
同样用一个标号,在原数组覆盖(序列长度有变化,且后面的元素不重要)同2
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int index=1;
for(int i=1;i<nums.size();i++){
if(nums[i]!=nums[i-1]){
nums[index++]=nums[i];
}
}
return index;
}
};
4、80. 删除有序数组中的重复项 II - 力扣(LeetCode)
使得出现次数超过两次的元素只出现两次,记录相等的次数
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size()<=2)
return nums.size();
int index=1;
int count=0;
for(int i=1;i<nums.size();i++){
if(nums[i]==nums[i-1]){
count++;
if(count<=1){
nums[index++]=nums[i];
}
}
else{
count=0;
nums[index++]=nums[i];
}
}
return index;
}
};
5、169. 多数元素 - 力扣(LeetCode)
数组中出现次数超过一半的数字” 被称为 “众数”
此数字出现次数大于所有其他数字出现次数
class Solution {
public:
int majorityElement(vector<int>& nums) {
int x=0,votes=0;
for(int num:nums){
if(votes==0) x=num;
votes+=x==num?1:-1;
}
return x;
}
};
6、189. 轮转数组 - 力扣(LeetCode)
(i+k)%n,新建数组
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n=nums.size();
vector<int> tmp(n);
for(int i=0;i<n;i++){
tmp[(i+k)%n]=nums[i];
}
nums.assign(tmp.begin(),tmp.end());
}
};