题目一:移除数组
原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)。
int removeElement(int* nums, int numsSize, int val) {
int l=0;
for(int i=0;i<numsSize;i++)
{
if(val!=nums[i])
{
nums[l]=nums[i];
l++;
}
}
return l;
}
思路:采用的是覆盖法
比如是{3,2,2,4,3},删去数字:3
如果符合if条件,就进去(如图操作),i++,l也跟着++
如果不符合条件,进不去,就只有i++,
这就达到了覆盖的目的了
题目二:删除排序数组中的重复项
26. 删除有序数组中的重复项 - 力扣(LeetCode)
int removeDuplicates(int* nums, int numsSize) {
int d=0;
int c=1;
while(c<numsSize)
{
if(nums[c] ==nums[d])
{
c++;
}
else
{
//下面如果不懂的话,写成这样更加容易理解
//d++;
//nums[d]=nums[c++];
nums[++d]=nums[c++];
}
}
return d+1;
}
注意的是:最后返回的是d+1;
你看一下我下面图的最后那里,d是不是还在3那里,所以得d+1才能正确返回
方法二:
这里也可以使用双指针的方法:(不过这里)
int removeDuplicates(int* nums, int numsSize) {
if (numsSize == 0) {
return 0;
}
int fast = 1, slow = 1;
while (fast < numsSize) {
if (nums[fast] != nums[fast - 1]) {
nums[slow] = nums[fast];
++slow;
}
++fast;
}
return slow;
}
作者:力扣官方题解
链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/solutions/728105/shan-chu-pai-xu-shu-zu-zhong-de-zhong-fu-tudo/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
思路:相等就两个指针都+1
不相等就加fast+1
依次下去
其实双指针的方法在链表的题目当中也非常常用。因此我也将会写一篇链表的oj题目分析,若需要的请期待。哈哈哈哈哈哈哈
题目三:合并两个有序数组
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
int end1=m-1;
int end2=n-1;
int dst=m+n-1;
while(end1>=0 && end2>=0)
{
if(nums2[end2]>nums1[end1])
{
nums1[dst--]=nums2[end2--];
}
else
{
nums1[dst--]=nums1[end1--];
}
}
//这里意思是:如果end1都比完了,end2没有比完,就直接移上去就行了
while(end2>=0)
{
nums1[dst--]=nums2[end2--];
}
}
思路:(如下)
好了,到了每次鸡汤部分:
最近看到的一句话送给大家:
邮件发出后,无法撤回。交给时间的一切不能遣返,这也是人生的逻辑。
赶路人们,放开一切顾虑,选择了,坚持下去,交给时间来帮我们收获梦想!