顺序表算法题
一,移除元素
27. 移除元素 - 力扣(LeetCode)
给你一个数组
nums
和一个值val
,你需要 原地 移除所有数值等于val
的元素。元素的顺序可能发生改变。然后返回nums
中与val
不同的元素的数量。假设
nums
中不等于val
的元素数量为k
,要通过此题,您需要执行以下操作:
- 更改
nums
数组,使nums
的前k
个元素包含不等于val
的元素。nums
的其余元素和nums
的大小并不重要。- 返回
k
。
思路
定义两个变量src和dst指向数组第一个位置,判断nums[src]是否等于val
1)相等 -->src++
2)不相等 -->nums[dst] = nums[src]; src++; dst++;
参考代码
int removeElement(int* nums, int numsSize, int val)
{int src = 0,dst = 0;while(src<numsSize){if(nums[src]==val){src++;}else{nums[dst] = nums[src];src++;dst++;}}return dst;
}
二,删除有序数组中的重复项
26. 删除有序数组中的重复项 - 力扣(LeetCode)
给你一个 非严格递增排列 的数组
nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回nums
中唯一元素的个数。考虑
nums
的唯一元素的数量为k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。- 返回
k
。
思路
定义两个指针dst和src 分别指向数组第一个位置和第二个位置,判断src和dst指向数据是否相等
1)相等 --> src++
2)不相等 -> dst++; nums[dst] = nums[src]; src++;
参考代码
int removeDuplicates(int* nums, int numsSize)
{int dst = 0,src = 1;while(src<numsSize){if(nums[src] == nums[dst]){src++;}else{dst++;nums[dst] = nums[src];src++;}}return dst+1;
}
int removeDuplicates(int* nums, int numsSize)
{int dst = 0,src = dst +1;while(src<numsSize){if(nums[src] != nums[dst] && ++dst != src){nums[dst] = nums[src];}src++;}return dst+1;
}
三,合并两个有序数组
88. 合并两个有序数组 - 力扣(LeetCode)
给你两个按 非递减顺序 排列的整数数组
nums1
和nums2
,另有两个整数m
和n
,分别表示nums1
和nums2
中的元素数目。请你 合并
nums2
到nums1
中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组
nums1
中。为了应对这种情况,nums1
的初始长度为m + n
,其中前m
个元素表示应合并的元素,后n
个元素为0
,应忽略。nums2
的长度为n
。
思路
创建三个指针l1 l2 l3,分别指向num1最后一个有效数据地址,nums2最后一个有效数据地址,nums1最后位置地址
判断l1和l2指向数据大小,较大的放入l3 l3和l1 l2较大的--
结束条件
1)l1<0 还要将剩余l2数据循环放入l1
2)l2<0 无需多余操作
参考代码
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{int l1 = m - 1,l2 = n - 1,l3 = m + n - 1;while(l1>=0 && l2>=0){if(nums1[l1]>nums2[l2]){nums1[l3--] = nums1[l1--];}else{nums1[l3--] = nums2[l2--];}}while(l2>=0){nums1[l3--] = nums2[l2--];}
}