leetcode321 拼接最大数

本文深入探讨了一种用于从两个整数数组中选取元素,以形成最大可能数值的算法实现。通过递归方法,该算法考虑了所有可能的组合,并最终返回由最高位到最低位组成的最大数值。代码示例使用C++编写,展示了如何比较和选择数组中的最大元素,以及如何将这些元素组合成最终的数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这题挺坑的,我还没填完坑

#include <iostream>
#include<stdlib.h>
#include<string>
#include<vector>
#include<math.h>
typedef  long long  ll;
using namespace std;
ll maxNumber2(vector<int>& nums1, vector<int>& nums2, int k,int i,int j) {
	if (k==0)
		return 0;
	int N = nums1.size();
	int M = nums2.size();	
	ll maxnum = -1;
	int max1 = -1;
	int max2 = -1;
	int flag = -1;
	int s1, s2;
	for ( int n = i; n < N; n++)
		if (N - n + M - j >= k&&max1 < nums1[n]) {
			max1 = nums1[n];
			s1 = n;
		}
	for (int  m = j; m < M;m++)
		if (N - i + M - m >= k&&max2 < nums2[m]) {
			max2 = nums2[m];
			s2 = m;
		}
	//cout<<"i:" << i << "   j:" << j << endl;
	//cout <<"k:"<<k<<"    " <<"max1: " << max1 << "         " << "max2: " << max2 << endl;
	if (max1 != max2) {
		flag = max1 > max2 ? 1 : 2;

		if (flag == 1) {
			//cout << "flag==2" << endl;
			maxnum = max1*pow(10, k - 1) + maxNumber2(nums1, nums2, k - 1, s1 + 1, j);
		}
		else {
			//cout << "flag==2" << endl;
			maxnum = max2*pow(10, k - 1) + maxNumber2(nums1, nums2, k - 1, i, s2 + 1);
		}
	}	
	else {
		//cout << "flag==-1" << endl;
		maxnum = max(maxNumber2(nums1, nums2, k - 1, s1 + 1, j), maxNumber2(nums1, nums2, k - 1, i, s2 + 1));
		maxnum = max1*pow(10, k - 1) + maxnum;
	}
	cout << "maxnum:" << maxnum << endl;
	return maxnum;
}

vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k) {
	vector<int>result;
	ll maxnum=maxNumber2(nums1, nums2, k, 0, 0);
	cout << maxnum << endl;
	for (int i = 0; i < k; i++) {
		result.push_back(maxnum / (ll)pow(10, k - i - 1));
		maxnum %= (ll)pow(10, k - i - 1);
	}

	return result;
}
int main() {
	//[2, 5, 6, 4, 4, 0]
	//[7, 3, 8, 0, 6, 5, 7, 6, 2]
	//15
	//[7, 9, 0, 4, 7, 0, 7, 1, 2, 9, 5]
	//[9, 1, 5, 8, 3, 9]
	//17
	vector<int>nums1 = { 7, 9, 0, 4, 7, 0, 7, 1, 2, 9, 5 };
	vector<int>nums2 = { 9, 1, 5, 8, 3, 9 };
	int k =16;                        //5;
	vector<int>result = maxNumber(nums1, nums2, k);
	for (int i = 0; i < result.size(); i++)
		cout << result[i] << " ";
	system("pause");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值