首页 > 其他分享 >20240324每日一题题解

20240324每日一题题解

时间:2024-03-24 14:44:54浏览次数:18  
标签:p2 p1 num1 num2 int 题解 每日 数组 20240324

20240324每日一题题解

Problem

给两个按照非递减顺序排列的整数数组num1num2,另外有两个整数mn,分别表示num1num2中的元素数目。

合并num2num1中,使得合并后的数组还是按照非递减顺序排列。

注意,需要将合并之后的数组还是存储在数组num1中。

示例 1:

输入:nums1=[1,2,3,0,0,0],m=3,nums2=[2,5,6],n=
3

输出:[1,2,2,3,5,6]

Solution

题外话:这道题的输入输出格式对于C++极其不友好。所以为了编写C++的程序,略微将输入输出方式稍加改变,变成输入三行,第一行输入mn,第二行和第三行分别输入num1num2两个数组,用空格分隔。

题外话2:今天的题目稍微难,可能涉及到sort()函数。但是学会了就非常好用。

合并+排序

将第二个数组插入到第一个数组的末尾,将第一个数组排序,即完成了两个数组的合并。

关于排序,我们使用头文件algorithm中的sort()函数。

sort(a,b)的用法:

首先,sort 函数的参数是一个范围,表示要对数组中某一段元素进行排序。它接受两个“位置”作为参数,第一个“位置”指向要排序的范围的起始位置,第二个“位置”指向要排序的范围的末尾位置的下一个位置

“位置”应该如何表达呢?数组的名字就是这个数组的启示位置。就比如说,num表示数组num的第0个位置,也就是num[0]的位置。

如果你要对a[1]...a[n]排序,那么应该写成sort(a+1,a+n+1)

#include<iostream>// 包含输入输出流头文件
#include<algorithm>// 包含algorithm头文件,用于使用 sort 函数
using namespace std;
int m,n;
int num1[1000],num2[1000];
int main()
{
	cin>>m>>n;
	
	// 循环读取 num1 中的元素,将其存储在数组 num1 中
	for(int i=1;i<=m;i++) 
		cin>>num1[i];
	
	// 循环读取 num2 中的元素,将其存储在数组 num2 中
	for(int i=1;i<=n;i++) 
		cin>>num2[i];
	
	// 将 num2 中的元素依次加入到 num1 中,从 m+1 的位置开始加入
	for(int i=1;i<=n;i++) 
		num1[i+m]=num2[1];
	
	
	// 使用 sort 函数对 num1 数组进行排序,从下标 1 开始,到 n+m 结束
	sort(num1+1,num1+n+m+1);
	
	/*
	我们希望对 num1 数组中从第二个元素(num1[1])开始,
	到最后一个元素(num1[n + m])结束的范围进行排序。
	所以,我们传递给 sort 函数的第一个参数是 num1 + 1,
	表示起始位置是从 num1 数组的第二个元素开始。
	而第二个参数是 num1 + n + m + 1,
	表示要排序的范围结束于 num1 数组的第 n + m 个元素的下一个位置。
	*/
	
	
	// 输出排序后的 num1 数组中的所有元素
	for(int i=1;i<=n+m;i++)
	{
		cout<<num1[i]<<" ";
	}
	return 0;
}

双指针+临时数组

注意到原来的两个数组是有序的,我们可以用更快的算法时间复杂度、更巧妙的算法来解决这个问题——双指针法。

双指针法合并两个有序数组的具体做法可以用非常浅显的道理来解释。

想象你有两摞扑克牌,每一摞都是按照从小到大的顺序排列好的。现在你想把这两摞牌合并成一摞,仍然保持从小到大的顺序。

  1. 你可以放两只手指在每一摞牌的顶端,然后比较两只手指所指的牌的大小。

  2. 如果其中一只手指所指的牌比较小,你就把这张牌放到新的一摞牌的最上面,然后移动那只手指到下一张牌。

  3. 反之,如果另一只手指所指的牌比较小,就把这张牌放到新的一摞牌的最上面,然后移动那只手指到下一张牌。

重复这个过程,直到两摞牌都遍历完,就完成了合并。

在这个过程中,两只手指分别对应着两个数组的索引,通过不断地移动手指和比较牌的大小,你可以很自然地将两个有序数组合并成一个有序数组。

#include<iostream>
using namespace std;
int num1[1000],num2[1000];// 声明两个数组 num1 和 num2,用于存储输入的整数序列
int ans[2000];// 声明数组 ans,用于存储合并后的整数序列
int m,n;// 声明变量 m 和 n,分别表示 num1 和 num2 中的元素数目
int main()
{
	//读入所有数据
	cin>>m>>n;
	for(int i=1;i<=m;i++) cin>>num1[i];
	for(int i=1;i<=n;i++) cin>>num2[i];
	
	int p1=1,p2=1,p3=1;
	// 声明三个整型 p1、p2、p3
	// 代表着当前处理到了数组的某个位置
	// 用于遍历 num1、num2 和 ans 数组
	
	// 循环合并 num1 和 num2 中的元素,直到其中一个数组遍历完毕
	while(p1<=m||p2<=n)
	{
		// 如果 num1 数组已经遍历完毕,将 num2 中的元素依次加入到 ans 中
		if(p1>m)
		{
			ans[p3]=num2[p2];
			p3++;
			p2++;
			continue;
		}
		// 如果 num2 数组已经遍历完毕,将 num1 中的元素依次加入到 ans 中
		if(p2>n)
		{
			ans[p3]=num2[p1];
			p3++;
			p1++;
			continue;
		}
		
		// 如果 num1[p1] 小于 num2[p2],说明 num1[p1] 应该在 num2[p2]的前面
		if(num1[p1]<num2[p2])
		{
			ans[p3]=num1[p1];// 将 num1[p1] 加入到 ans 中,并移动 p1 指针
			p3++;
			p1++;
		}
		else// 否则,将 num2[p2] 加入到 ans 中,并移动 p2 指针
		{
			ans[p3]=num2[p2];
			p3++;
			p2++;
		}
	}
	
	// 输出合并后的数组 ans
	for(int i=1;i<p3;i++)
	{
		cout<<ans[i]<<" ";
	}
	
	return 0;
}

标签:p2,p1,num1,num2,int,题解,每日,数组,20240324
From: https://www.cnblogs.com/Vanilla-chan/p/18092414

相关文章

  • 牛客周赛ROUND37--C题解
    C-红魔馆的馆主(495倍数)题意:做法:dfs搜索后面添加的数字。stringans="1000000000000000000";voiddfs(intcur,stringaddnum){//用数字写的话会无限dfs,因为addnum永远等于0。if(cur==0){if(addnum.size()<ans.size())ans=addnum;return;......
  • 最长子字符串的长度(二)【华为OD机试JAVA&Python&C++&JS题解】
    一.题目-最长子字符串的长度(二)给你一个字符串s,字符串s首尾相连成一个环形,请你在环中找出’l’、‘o’、‘x’字符都恰好出现了偶数次最长子字符串的长度。输入描述:输入是一串小写的字母组成的字符串。输出描述:输出是一个整数补充说明:1<=s.length<=5x10^5......
  • 孙悟空吃蟠桃【华为OD机试JAVA&Python&C++&JS题解】
    一.题目-孙悟空吃蟠桃孙悟空爱吃蟠桃,有一天趁着蟠桃园守卫不在来偷吃。已知蟠桃园有N颗桃树,每颗树上都有桃子,守卫将在H小时后回来。孙悟空可以决定他吃蟠桃的速度K(个/小时),每个小时选一颗桃树,并从树上吃掉K个,如果树上的桃子少于K个,则全部吃掉,并且这一小时剩余的时间里不再......
  • python每日可视化分析:从过去到现代数据分析的演进
    分析目标本文旨在探索数据分析发展历程中的关键时刻,包括重要人物的贡献和大事件的发生。通过对比不同年代的数据分析技术和方法,我们可以更好地理解数据分析如何成为今天决策制定不可或缺的一部分。分析步骤收集数据:搜集关于数据分析历史上重要人物和事件的信息。数据与可......
  • P10234 [yLCPC2024] B. 找机厅 题解
    题目简述给定一个$n$行$m$列的$01$矩阵,每次可以花费$1$的时间移动到邻近的上下左右的四个格子,求从$(1,1)$点到$(n,m)$的最少时间,并给出具体路径。题目分析第一问易发现是BFS模板题,在这里不多说。第二问我们首先考虑正着记录,即记录每一个点转移到了哪一个点,但......
  • CF1896C Matching Arrays 题解
    题目简述给定两个长度为$n$的数列$a,b$,再给定一个数$x$,请你判断是否存在一种重排$b$数列的方式,使得满足$a_i>b_i$的$i$恰好有$x$个。$n\leq2\times10^5$。题目分析遇到这种可行性问题,首先考虑做出最优解,以此来判断是否无解。接下来,可以思考最优解如何构造,我们......
  • CF1468J Road Reform 题解
    题目简述给定一个有$n$个节点,$m$条无向带权边的图,和一个参数$k$,第$i$条边权值为$s_i$。现在你要保留这个图中的$n-1$条边使得这个图变成一棵树,然后你可以对这棵树上的任意边进行修改,每次修改可以使这个边的权值加上一或减去一。现在你需要使所有边权的最大值正好等于......
  • 20240323每日一题题解
    20240323每日一题题解Problem输出2024是十二生肖中的哪个动物年?(只需要输出排行第几即可)鼠视为十二生肖中的第一位。注意:答案输出为阿拉伯数字。Solution首先,我要感谢班长在百忙之中选择了这样的一道题,让我在不是周末的周日能够抽出时间水题解报告。你说的对,但是《原神》......
  • CF1628D1 Game on Sum (Easy Version) 题解
    题目传送门(EasyVersion)|题目传送门(HardVersion)前置知识博弈论解法CF1628D1GameonSum(EasyVersion)设\(x_{i}\)表示第\(i\)轮时Alice选择的数。设\(f_{i,j}\)表示已经进行了\(i\)轮,且使用了\(j\)次加法时的最大得分,状态转移方程为\(f_{i,j}=\ma......
  • codeforces div_2 936 题解报告
    codeforcesdiv_2936题解报告比赛链接:https://codeforces.com/contest/1946A.MedianofanArray做法tag:签到题目翻译给定一个长度为\(n\)的数组\(a\),记数组中非降序排列中第\({\lceil\fracn2\rceil}\)个数是数组a的中位数。我们可以以下操作。选择一个数\(i\in[......