目录
1.移除元素
方法1【暴力求解】
方法2【双指针】
2.删除两个有序数组中的重复项
方法1【双指针】
3.合并两个有序数组
方法1【暴力求解】
方法2【开辟新数组】---选择较小的尾插
方法3【三指针】---选择较大的头插
4.有序数组的合并
方法1【三指针】
写一个算法代码需要考虑:起始条件,中间过程,结束条件。
给你一个数组
nums
和一个值val
,你需要 原地 移除所有数值等于val
的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用O(1)
额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1:
输入:nums = [3,2,2,3], val = 3 输出:2, nums = [2,2] 解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
时间复杂度:O(N^2)
易错:
int removeElement(int* nums, int numsSize, int val)
{
int i = 0;
for (i = 0; i < numsSize; i++)
{
if (nums[i] == val)
{
int j = i;
while (j < numsSize)
{
nums[j] = nums[j + 1];
j++;
}
numsSize--;
i--;
}
}
return numsSize;
}
//OJ上是错误的❌
//首先遍历数组一遍找到元素,从后向前依次覆盖需要删除的元素
时间复杂度:O(N)
易错:
int removeElement(int* nums, int numsSize, int val)
{
int src=0;
int dst=0;
while(src
给你一个 非严格递增排列 的数组
nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回nums
中唯一元素的个数。考虑nums
的唯一元素的数量为k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。- 返回
k
。- 非严格递增排列 == 非递减排列 != 乱序排列
示例 1:
输入:nums = [1,1,2] 输出:2, nums = [1,2,_] 解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为1,2。不需要考虑数组中超出新长度后面的元素。
时间复杂度:O(N)
易错:
int removeDuplicates(int* nums, int numsSize)
{
int dst=1;
int src=0;
while(dst
给你两个按 非递减顺序 排列的整数数组
nums1
和nums2
,另有两个整数m
和n
,分别表示nums1
和nums2
中的元素数目。请你 合并nums2
到nums1
中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组
nums1
中。为了应对这种情况,nums1
的初始长度为m + n
,其中前m
个元素表示应合并的元素,后n
个元素为0
,应忽略。nums2
的长度为n
。
示例 1:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 输出:[1,2,2,3,5,6] 解释:需要合并 [1,2,3] 和 [2,5,6] 。 合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。
时间复杂度:O(N^2)
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
int i=0;
for(i=0;inums1[j+1])
{
int tmp=nums1[j];
nums1[j]=nums1[j+1];
nums1[j+1]=tmp;
}
}
}
}
时间复杂度 O(N)
易错:
时间复杂度 O(N)
易错:
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(p2>=0&&p1>=0)
{
if(nums1[p1]p2
{
nums1[j--]=nums1[p1];
p1--;
}
}
while(p2>=0)
{
nums1[j--]=nums2[p2--];
}
}
【整个思路】:
【详解】:
【结束条件】:
描述:输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
输入描述:输入包含三行,
第一行:包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。
第二行:包含n个整数,用空格分隔。
第三行:包含m个整数,用空格分隔。
输出描述:
输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并
示例1
输入: 5 6
1 3 7 9 22
2 8 10 17 33 44
输出: 1 2 3 7 8 9 10 17 22 33 44
大家还记得这个题目吗?在我们数组题目当中也是讲解过暴力求解的方法。这里我们可以使用三指针的方法自己写一写。
操作符&算数转换题_唐唐思的博客-CSDN博客
✔✔✔✔✔最后,感谢大家的阅读,若有错误和不足,欢迎指正!
代码---------→【唐棣棣 (TSQXG) - Gitee.com】
联系---------→【邮箱:[email protected]】