C语言每日一题:6.移除元素+合并两个有序数组。

这篇具有很好参考价值的文章主要介绍了C语言每日一题:6.移除元素+合并两个有序数组。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第一题:移除元素

C语言每日一题:6.移除元素+合并两个有序数组。,c语言,算法,数据结构

思路一:

一:暴力查找的方法:
1.找到对应val值的下标,返回数组的下标。
2.删除对应的下标,从前向后用后面覆盖前面。当后一个是数组最后一个数值是就赋值结束了(注意数组越界的问题)。
3.删除了一个数之后数组元素个数要–。
4.查找和删除是在一个循环里面因为val的值可能在数组中出现多次,直到返回的下标的值没有了,就结束了循环,val的数值都移除完了。

// 顺序表查找
int SeqListFind(int* ps, int x,int nume)
{
	//遍历查找
	int n = nume;
	for (int i = 0; i < n; i++)
	{
		if (ps[i] == x)
		{
			return i;
		}
	}
	return -1;
}
// 顺序表删除pos位置的值
void SeqListErase(int* ps, int pos,int num)
{
	int n = num;
	for (int i = pos; i < n-1; i++)
	{
		ps[i] = ps[i+1];
	}
}


int removeElement(int* nums, int numsSize, int val){
    while(1)
    {
        int b=SeqListFind(nums,val,numsSize);
        if(b==-1)
        {
            break;
        }
        else
        {
            SeqListErase(nums,b,numsSize);
            numsSize--;
        }
    }
    return numsSize;
}

思路二:

二:使用双指针的方法
1.不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
2.定义两个下标:src和dis,他们开始的时候是在一起的对应的数组值都不是val的时候,同时++。
3.只要src位置是val就src++;
4.当src位置不是val就把src位置的值赋值到dis,到src>n-1循环结束

int removeElement(int* nums, int numsSize, int val)
{
    int src=0;
    int dis=0;
    int n=numsSize;
    int count=0;
    while(src<=n-1)
    {
        if((src==dis) && (nums[src]!=val))
        {
            src++;
            dis++;
        }
        else if((nums[src]==val))
        {
            src++;
            count++;
        }
        else if((nums[src]!=val))
        {
            nums[dis]=nums[src];
            src++;
            dis++;
        }
    }
    return n-count;
}

第二题:

C语言每日一题:6.移除元素+合并两个有序数组。,c语言,算法,数据结构
第二题:

思路一:

一.双指针的方法
1.定义p1,p2 两个变量,初始化为0从两个数组开头开始向后移动。
2.同时比较nums1[p1]和nums2[p2]这两个位置的数值。
3.开辟一个新的数组大小为m+n两个数组长度的和。
4.在比较的过程中较小的值放到新的数组,开辟数组的下标++,小的值的数组的下标++。
5.结束条件p1>=m 中有一个 p2>=n就结束。
6.出来之后另一个没有放完,p1=m,说明nums2没有放完。反之同理。
7.tmp拷贝回去到nums1中
空间复杂度是O(N)时间复杂度O(2*(M+N));

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    int p1=0;
    int p2=0;
    int* tmp=(int*)malloc(sizeof(int)*(m+n));
    int i=0;

    while((p1<m)&&(p2<n))
    {
        
        if(nums1[p1]>=nums2[p2])
        {
                *(tmp+i)=nums2[p2];
                p2++;
                i++;
                continue;
        }

        else if(nums1[p1]<nums2[p2])
        {
                *(tmp+i)=nums1[p1];
                p1++;
                i++;
                continue;
        }
    }

     if(p1>m-1)
        {
            memcpy(tmp+i,nums2+p2,sizeof(int)*(n-p2));
        }
     else if(p2>n-1)
        {
            memcpy(tmp+i,nums1+p1,sizeof(int)*(m-p1));
        }



    memcpy(nums1,tmp,sizeof(int)*(m+n));
}

思路二:

三指针的方法:
1.p1起始位置是m-1,p2起始位置是n-1.数组值的尾。
2.end起始位置是(m+n)-1在nums1上。
3.分别从尾开始比较赋值到nums1[end]位置,谁赋值过去对应的p就–,end–。
4.当p1==-1,p2还没有结束需要把值赋值到对应的num1上。
5.当p2==-1就说明已经结束。
时间复杂度优化到了O(m+n)
C语言每日一题:6.移除元素+合并两个有序数组。,c语言,算法,数据结构文章来源地址https://www.toymoban.com/news/detail-609726.html

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){

        int p1=m-1;
        int p2=n-1;
        int end=(m+n)-1;

        while(p1>=0 && p2>=0)
        {
            if(nums1[p1]>nums2[p2])
            {
                nums1[end]=nums1[p1];
                p1--;
                end--;
            }
            else
            {
                nums1[end]=nums2[p2];
                p2--;
                end--;
            }
        }

        while(p2>=0)
        {
            nums1[end]=nums2[p2];
            p2--;
            end--;
        }
}

到了这里,关于C语言每日一题:6.移除元素+合并两个有序数组。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Leetcode每日一题——“合并两个有序数组”

    Leetcode每日一题——“合并两个有序数组”

    各位CSDN的uu们你们好呀,又到小雅兰的愉快题解时候啦,今天,我们的题目内容是合并两个有序数组,下面,让我们进入合并两个有序数组的世界吧 示例 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

    2023年04月24日
    浏览(12)
  • 力扣每日一题88:合并两个有序数组

    给你两个按  非递减顺序  排列的整数数组  nums1   和  nums2 ,另有两个整数  m  和  n  ,分别表示  nums1  和  nums2  中的元素数目。 请你  合并   nums2   到  nums1  中,使合并后的数组同样按  非递减顺序  排列。 注意: 最终,合并后数组不应由函数返回,而是存储在

    2024年02月07日
    浏览(13)
  • 图灵日记之Leetcode删除有序数组中的重复项&&合并两个有序数组&&移除链表元素

    给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过

    2024年02月04日
    浏览(9)
  • 【力扣每日一题】2023.8.13 合并两个有序数组

    【力扣每日一题】2023.8.13 合并两个有序数组

    目录 题目: 示例: 分析: 代码: 题目给我们两个升序数组,让我们合并它们,要求合并之后仍然是升序,并且这个合并操作是在数组1原地修改的。数组1的有效数据长度为 m ,而数组1的长度为 m + n,n 是数组2的有效数据长度以及数组的长度。 比较直观容易想到的做法就是

    2024年02月12日
    浏览(12)
  • 2023-08-13 LeetCode每日一题(合并两个有序数组)

    2023-08-13 LeetCode每日一题(合并两个有序数组)

    点击跳转到题目位置 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 **注意:**最终,合并后数组不应由函数返回,而是存储在数组 num

    2024年02月13日
    浏览(15)
  • 【力扣每日一题】88. 合并两个有序数组 &双指针 & 辅助数组 & 8.13打卡

    【力扣每日一题】88. 合并两个有序数组 &双指针 & 辅助数组 & 8.13打卡

    88. 合并两个有序数组 难度: 简单 描述: 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意:最终,合并后数组不应由函数返回,而

    2024年02月09日
    浏览(11)
  • 力扣经典150题第一题:合并两个有序数组

    合并两个有序数组问题详解与解决方法 1. 介绍 在编程面试中,合并两个有序数组是一个经典的问题。它要求将两个有序数组合并为一个新的有序数组。本篇博客将深入讨论这个问题,并提供解决方法。 2. 问题描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两

    2024年04月23日
    浏览(17)
  • ( 数组) 27. 移除元素 ——【Leetcode每日一题】

    ( 数组) 27. 移除元素 ——【Leetcode每日一题】

    难度:简单 给你一个数组 nums 和一个值 val ,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 说明

    2024年02月08日
    浏览(8)
  • 力扣每日一道系列 --- LeetCode 88. 合并两个有序数组

    力扣每日一道系列 --- LeetCode 88. 合并两个有序数组

    📷 江池俊: 个人主页 🔥个人专栏: ✅数据结构探索 ✅LeetCode每日一道 🌅 有航道的人,再渺小也不会迷途。 LeetCode 88. 合并两个有序数组 首先创建一个临时数组,其大小为第一个数组的大小(即nums1Size),其作用主要是。 通过循环遍历两个数组,将两个数组元素比较后较

    2024年02月04日
    浏览(15)
  • “三指针法“合并两个有序数组(力扣每日一练)

    “三指针法“合并两个有序数组(力扣每日一练)

            我的第一想法确实是:先合并数组,再排序,搞完。         哈哈哈,想那么多干嘛,目的达成了就好了。 力扣官方题解是双指针: 还有糕手: Python: C#:       总结         可以称之为\\\"三指针\\\" 方法,因为我们同时使用了三个指针(p1、p2 和 p)来操作和遍历两

    2024年02月02日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包