27. 移除元素https://leetcode.cn/problems/remove-element/
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素。元素的顺序可能发生改变。然后返回 nums
中与 val
不同的元素的数量。
假设 nums
中不等于 val
的元素数量为 k
,要通过此题,您需要执行以下操作:
- 更改
nums
数组,使nums
的前k
个元素包含不等于val
的元素。nums
的其余元素和nums
的大小并不重要。 - 返回
k
。
C语言:双指针思想
int removeElement(int* nums, int numsSize, int val) {
int left = 0;
for(int right = 0; right < numsSize; right++)
{
if(nums[right] != val)
{
nums[left] = nums[right];
left++;
// 分为左右指针移动,左指针保存处理后数组,右指针进行数组遍历
// 当右指针访问为非要求元素时,进行数据的搬运,右侧元素转入左侧,同时左指针右移
}
}
return left;
}
int removeElement(int* nums, int numsSize, int val) {
int slow = 0, fast = 0; //一对夫妇,原本都是零起点
while (fast < numsSize) { //但是有一个跑得快,一个跑得慢
if (nums[fast] != val) { //于是跑得快的那个先去寻找共同目标
nums[slow] = nums[fast]; //如果找到了,就送给跑得慢的那个
slow++; //然后跑得慢的那个也就离目标近一点
}
fast++; //但是不管是否找得到,跑得快的那方都一直奔跑到生命的尽头
}
return slow; //最终留下跑得慢的一方
}
26. 删除有序数组中的重复项https://leetcode.cn/problems/remove-duplicates-from-sorted-array/
给你一个 非严格递增排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
考虑 nums
的唯一元素的数量为 k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。 - 返回
k
。
int removeDuplicates(int* nums, int numsSize) {
if(numsSize == 1)
return 1;
// 如果遇到只有一个元素直接返回1
int slow = 0, fast = 1;
while(fast < numsSize) // 定义快慢指针,使用快指针进行遍历数组
{
if(nums[slow] == nums[fast]) // 左右相同快指针向前移动
{
fast++;
}
else // 若快慢指针不再相同 则把快指针元素左移
{
nums[slow+1] = nums[fast];
slow++;
}
}
return slow+1;
}
88. 合并两个有序数组https://leetcode.cn/problems/merge-sorted-array/
给你两个按 非递减顺序 排列的整数数组 nums1
和 nums2
,另有两个整数 m
和 n
,分别表示 nums1
和 nums2
中的元素数目。
请你 合并 nums2
到 nums1
中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1
中。为了应对这种情况,nums1
的初始长度为 m + n
,其中前 m
个元素表示应合并的元素,后 n
个元素为 0
,应忽略。nums2
的长度为 n
。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
for(int i = 0; i != n; i++)
{
nums1[m + i] = nums2[i];
}
sort(nums1.begin(), nums1.end());
}
};
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i = nums1.size() - 1;
m--;
n--;
while(n >= 0)
{
// 从nums1末尾开始进行运算,把俩个数组中值大的放在nums1的末尾位置
while(m >= 0 && nums1[m] > nums2[n])
{
swap(nums1[i--], nums1[m--]);
}
swap(nums1[i--], nums2[n--]);
}
}
};