𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary-walk
⸝⋆ ━━━┓
- 个性标签 - :来于“云”的“羽球人”。 Talk is cheap. Show me the code
┗━━━━━━━ ➴ ⷯ本人座右铭 : 欲达高峰,必忍其痛;欲戴王冠,必承其重。
👑💎💎👑💎💎👑
💎💎💎自💎💎💎
💎💎💎信💎💎💎
👑💎💎 💎💎👑 希望在看完我的此篇博客后可以对你有帮助哟👑👑💎💎💎👑👑 此外,希望各位大佬们在看完后,可以互赞互关一下,看到必回
👑👑👑💎👑👑👑
一:原地移除指定的元素值
题目:
思路讲解:
我们以此数组为例:
1:首先定义2个变量 n1,n2都分别指向第一个元素(注意n2的初始值必须指向首元素)
2:当 nums[n2] == val 向后移动n2一步
3:nums[n2] != val 则执行 nums[n1++] = nums[n2++] 也就是 n2对应指向的元素赋值给 n1
草图见下:
OJ代码实现
int removeElement(int* nums, int numsSize, int val)
{
// int fast = 1,slow = 0; 注意这里fast必须初始值是0(可能存在第一个元素就为val)
int n1 = 0,n2 = 0;
while(fast<numsSize)
{
if(nums[n2] == val)
{
n2++;
}
else
{
nums[n1++] = nums[n2++];
}
}
return n1;
}
二:删除排序数组重复项
题目:
思路讲解:
这里我们一人是双指针的玩法:
1:定义2个指针n1 = 0,n2 = 1 注意n1,n2只表示下标的含义
2:nums[n1] == nums[n2] ,此时n2++
直到 nums[n1] != nums[n2] 执行 nums[++n1] = nums[n2++]注意到底是先加加还是先用数值
草图见下:
OJ代码实现
int removeDuplicates(int* nums, int numsSize)
{
int n1 = 0,n2 = 1;
while(n2 < numsSize)
{
if( nums[n1] == nums[n2])
{
n2++;
}
else
{
nums[++n1] = nums[n2++];
}
}
return n1+1;
}
三: 合并2个有序数组
题目:
思路讲解:
这里我们用三指针的玩法是最优解
1:定义三个变量 l:返回新数组的大小;l1:数组1的大小;l2:数组2的大小
2:借助尾插的思想,比较2个数组元素谁大,取大的进行尾插到数组1的末尾,依次循环
3:注意第一个循环判断条件必须是 逻辑且(不能是逻辑或):因为当有一个数组已经走完的时候剩下 的那个未走完的数组直接进行赋值拷贝即可
4:若是第2个数组先走完的,那么此时已经完成了数组的合并
5:若是第1个数组先走完的下面还需要对数组2 余下的内容进行赋值拷贝
草图见下:
OJ代码实现
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
/*
借助尾插思想:从目标数组的最后一个位置开始进行:取2个数组中较大的元素尾插
*/
int l= m+n-1,l1 = m-1,l2 = n-1;
while(l1 >= 0 && l2 >= 0)
{
if(nums1[l1] >= nums2[l2])
{
nums1[l--] = nums1[l1--];
}
else
{
nums1[l--] = nums2[l2--];
}
}
if(l1 < 0)
{
while(l2>= 0)
{
nums1[l--] = nums2[l2--];
}
}
}
结语:
以上就是今日为大家share 的内容。其实仔细看一下,发现这些题目还是有相似之处的。但是但是:做题的思路又有些出入,这时我们不妨静下心来好好复盘一下,看看是否有可以继续深挖的地方。
ok,接下来咱走起来,老铁你懂滴!