3.9 顺序表题目练习

本文介绍了三种不同的方法来移除数组中的指定元素,包括传统解法、新数组拷贝和双指针策略。接着讨论了如何在有序数组中删除重复项,提供了两种双指针解决方案。最后探讨了如何在不使用额外数组的情况下合并两个非递减数组,保证时间复杂度为O(N)。这些技巧对于优化数组操作的效率至关重要。
摘要由CSDN通过智能技术生成

目录

1移除元素​

1.1传统解法

 1.2思路2

 1.3思路3(双指针)

2.删除有序数组中的重复项

2.1双指针

2.2方法二(时间复杂度O(N))

3.合并两个非递减数组(要求:时间复杂度O(N))

 3.1归并的思路

3.2不开额外的数组


1移除元素

1.1传统解法

依次挪动数据覆盖查找到每一个val

空间复杂度O(1)

时间复杂度O(N^2)

最坏情况:全是val

 

 1.2思路2

把不是val的值拷贝到新数组

时间复杂度O(N)

空间复杂度O(N)

 1.3思路3(双指针)

 新的长度就是dst

int removeElement(int* nums, int numsSize, int val){
    int src = 0,dst=0;
    while(src<numsSize)
    {
        if(nums[src]!=val)
        {
            nums[dst] = nums[src];
            src++;
            dst++;
        }
        else
        {
            src++;
        }
    }
    return dst;
}

2.删除有序数组中的重复项

2.1双指针

 

 

 src和它的前一个位置比较,如果相等则后移,如果不相等,将前一个值放入dst中

if(nums[src - 1] == nums[src])
{
	scr++;
}
else
{
	nums[dst] = nums[src - 1];
	scr++;
	dst++;
}

 本质src跟src-1位置值,不相等时,前一段重复值区间已经走完了,那么把最后一个保留到dst的位置

 

int removeDuplicates(int* nums, int numsSize){
    int src = 1,dst = 0;
    while(src<numsSize)
    {
        if(nums[src]==nums[src-1])
        {
            src++;
        }
        else
        {
            nums[dst] = nums[src-1];
            src++;
            dst++;
        }
    }
    nums[dst] = nums[numsSize-1];
    dst++;
    return dst;
}

2.2方法二(时间复杂度O(N))

 

int removeDuplicates(int* nums, int numsSize)
{
	if (numsSize == 0)
		return 0;
	int dst = 0;
	int cur = 0, next = 1;
	while (next < numsSize)
	{
		if (nums[cur] != nums[next])
		{
			nums[dst++] = nums[cur++];
			++next;
		}
		else
		{
			while (next < numsSize && nums[cur] == nums[next])
			{
				++next;
			}
			nums[dst] = nums[cur];
			++dst;
			cur = next;
			++next;
		}
	}
	if (cur < numsSize)
		nums[dst++] = nums[cur];
	return dst;
}

 

3.合并两个非递减数组(要求:时间复杂度O(N))

 3.1归并的思路

依次比较,每次把小的放到归并数组

if (nums[i] < nums[j])
	a[dst++] = num[i++];
else
    a[dst++] = nums[j++];

3.2不开额外的数组

 

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    int i = m-1,j = n-1;
    int dst = m+n-1;

    while(i>=0&&j>=0)
    {
        if(nums1[i] > nums2[j])
        {
            nums1[dst] = nums1[i];
            dst--;
            i--;
            //nums1[dst--] = nums1[i--];
        }
        else
        {
            nums1[dst--] = nums2[j--];
        }
    }
    while(j>=0)
    {
        nums1[dst--] = nums1[j--];
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值