顺序表算法题---顺序表的去重操作(第12讲)
算法题一. 移除元素


思路一:申请一个新数组,使新数组空间大小与原数组大小相等,遍历原数组,将值不为val的数放入新数组中,再将新数组中的数导入到原数组中。时间复杂度为O(N),空间复杂度也为O(N)。
思路二:双指针法(创建两个变量)src和dst,如果src指向的数据是val,src++;如果src指向的数据不是val,赋值(src给dst),然后src和dst都++。(时间复杂度为O(N),空间复杂度为O(1))。
总之,src在前面探路,找非val值;dst在后面站岗,保存非val值。

int removeElement(int* nums, int numsSize,int val) {//创建两个变量int src=0,dst=0;while(src<numsSize){//src等于val,src++//src不等于val,先赋值然后整体++if(nums[src]!=val){nums[dst]=nums[src];dst++;}src++;}return dst;}算法题二:删除有序数组中的重复项


思路一:创建新数组,遍历原数组,将不重复数据导入到原数组中,再将新数组中的数据导入到原数组中。创建两个变量i和j。时间复杂度为O(N),空间复杂度为O(N)。
思路二:双指针法。创建两个变量dst和src,分别指向数组起始和下一个位置,①如果src的值和dst的值相等,src++;②如果src的值和dst的值不相等,dst++,然后把src的值赋值给dst,src++。

int removeDuplicates(int* nums, int numsSize) {//定义两个变量int dst=0;int src=dst+1;while(src!=numsSize){if(nums[src]!=nums[dst]){dst++;if(src!=dst){nums[dst]=nums[src];}}src++;}return dst+1;
}代码优化:
int removeDuplicates(int* nums, int numsSize) {//定义两个变量int dst=0;int src=dst+1;while(src!=numsSize){if(nums[src]!=nums[dst]&&src!=++dst){nums[dst]=nums[src];}src++;}return dst+1;
}算法题三:合并两个有序数组


思路一:先合并两个数组,再对nums1进行排序,如果此时排序方法选择“冒泡排序”,则此时时间复杂度为O(N^2)。
思路二:从后往前遍历数组,找大(谁大谁先往后放)。时间复杂度为O(N)。

