1.第一题
分析:对于此题,我们使用双指针的方式去写它,需要注意空间复杂度是O(1),时间复杂度也是尽量的越低越好,要去需要原地修改数组,因此不能够创建其他的临时数组。
代码如下:
int removeElement(int* nums, int numsSize, int val)
{
int str = 0;
int des = 0;
while(str < numsSize)
{
if(nums[str] == val)
{
str++;
}
else
{
nums[des]=nums[str];
des++;
str++;
}
}
return des;
}
2.第二题
26. 删除有序数组中的重复项 - 力扣(LeetCode)
文字分析:
1.此题本质上是一个去重算法
2. 需要在原数组上改动,那么一定要用到数组上元素的覆盖
3.元素要覆盖的话,必须要使用两个以及指针去指向这两个元素才能完成元素的覆盖
4.覆盖完成之后,输出最前的数据,就是已经排好顺序的去重之后的数据了
5.我们这里采用的指针是ptr和str
6.当ptr指向的数据和str指向的数据相同的时候,str往后挪动一位,如果此时还相同,就继续往后挪动,直到ptr和str指向的数据不相同,此时将ptr向后移动一位(保留一开始指向位置的数据,而后面的数据将被覆盖),再把str指向的值赋值给ptr指向的值
图解分析:
参考代码:
int removeDuplicates(int* nums, int numsSize)
{
int str = 0;
int ptr = 0;
while(str < numsSize)
{
if(nums[str] == nums[ptr])
{
str++;
}
else
{
ptr++;
nums[ptr] = nums[str];
}
}
return ptr+1;
}
3.第三题
思路分析:
1.非递减顺序可以理解为升序的序列
2.本题的要求是要合并两个数组nums1和nums2,合并之后的数组要存在第一个数组nums1里面,且刚刚好存满这个数组nums1
3.并且存完之后的nums2是升序排列的
4.那要怎么保证升序呢?
5.将nums2中的元素和nums1的中的元素比较就行,从后往前遍历2个数组,较大的放最后,较小的放前面
6.若要比较,那么至少需要三个指针来比较,指针p1和指针p2,指向的是要比较的元素,指针j指向的是比较完之后的那么较大的值或者较小的值应该怎么存。
图片分析:
第一种情况:
第二种情况:
参考代码:
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
int p1 =m-1;
int p2 =n-1;
int j=m+n-1;
while(p1>=0 && p2>=0)
{
if(nums1[p1]>nums2[p2])
{
nums1[j--]=nums1[p1--];
}
else
{
nums1[j--]=nums2[p2--];
}
}
while(p2>=0)
{
nums1[j--]=nums2[p2--];
}
}