leetcode 321. Create Maximum Number

Given two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum number of length k <= m + n from digits of the two. The relative order of the digits from the same array must be preserved. Return an array of the k digits. You should try to optimize your time and space complexity.

Example 1:

nums1 = [3, 4, 6, 5]
nums2 = [9, 1, 2, 5, 8, 3]
k = 5
return [9, 8, 6, 5, 3]

Example 2:

nums1 = [6, 7]
nums2 = [6, 0, 4]
k = 5
return [6, 7, 6, 0, 4]

Example 3:

nums1 = [3, 9]
nums2 = [8, 9]
k = 3
return [9, 8, 9]

看到题先打个标签,贪心问题,大致思路有了,剩下就是程序设计的细节。

这题还算难点的。程序设计时往往需要考虑特例情况,在这一题中就要考虑某次可以从nums1和nums2里取出的最大的数相等的情况该怎么办,这时你如果死揪着这个不放就会陷入一个黑洞——如果往下算一层还是相等怎么办?这样程序写起来就会很复杂,而且不清晰,甚至根本写不出来。这时你就要换一个思路了。程序员要做的应该是简单的事,复杂的事嘛就交给计算机好了。这话说起来容易,其实要做到挺不容易,慢慢体会吧。

回到这个问题,非要在这次就得到一个唯一的答案吗?不必的。相等的话就都留下吧,留给下一次处理,不要妄想一次就把所有问题都解决,每次解决一点,每次都往正确解靠近就行。


class Solution {
public:
	int do_once(vector<int>&nums1,vector<int>&nums2,vector<pair<int, int>>&candi, int k,set<pair<int,int>>&hist)
	{
		vector<pair<int, int>>newcandi;
		int maxret = 0;
		for (int i = 0; i < candi.size(); i++)
		{
			int choose1(-1), choose2(-1);
			int ptr1(0), ptr2(0);
			if (nums1.size()-candi[i].first + nums2.size()-candi[i].second == k)
			{
				if (candi[i].first==nums1.size() || candi[i].second==nums2.size())
				{
					if (candi[i].first == nums1.size())
					{
						if (nums2[candi[i].second] >= maxret)
						{
							if (nums2[candi[i].second] > maxret)
							{
								maxret = nums2[candi[i].second];
								newcandi.clear();
							}
							int aa = candi[i].second+1;
							if (hist.find(pair<int, int>(candi[i].first,aa)) == hist.end())
							{
								newcandi.push_back(pair<int, int>( candi[i].first,aa));
								hist.insert(pair<int, int>(candi[i].first,aa));
							}
						}
					}
					if (candi[i].second==nums2.size())
					{
						if (nums1[candi[i].first] >= maxret)
						{
							if (nums1[candi[i].first] > maxret)
							{
								maxret = nums1[candi[i].first];
								newcandi.clear();
							}
							int aa = candi[i].first+1;
							if (hist.find(pair<int, int>(aa, candi[i].second)) == hist.end())
							{
								newcandi.push_back(pair<int, int>(aa, candi[i].second));
								hist.insert(pair<int, int>(aa, candi[i].second));
							}
						}
					}
				}
				else
				{
					int gt = nums1[candi[i].first] > nums2[candi[i].second] ? nums1[candi[i].first] : nums2[candi[i].second];
					if (gt >= maxret)
					{
						if (gt > maxret)
						{
							newcandi.clear();
							maxret = gt;
						}
						if (nums1[candi[i].first] > nums2[candi[i].second])
						{
							int aa = candi[i].first+1;
							if (hist.find(pair<int, int>(aa, candi[i].second)) == hist.end())
							{
								newcandi.push_back(pair<int, int>(aa, candi[i].second));
								hist.insert(pair<int, int>(aa, candi[i].second));
							}
						}
						else if (nums1[candi[i].first] < nums2[candi[i].second])
						{
							int aa = candi[i].second+1;
							if (hist.find(pair<int, int>( candi[i].first,aa)) == hist.end())
							{
								newcandi.push_back(pair<int, int>(candi[i].first,aa));
								hist.insert(pair<int, int>( candi[i].first,aa));
							}
						}
						else
						{
							int aa = candi[i].second+1;
							if (hist.find(pair<int, int>(candi[i].first,aa)) == hist.end())
							{
								newcandi.push_back(pair<int, int>( candi[i].first,aa));
								hist.insert(pair<int, int>( candi[i].first,aa));
							}

						int bb = candi[i].first+1;
							if (hist.find(pair<int, int>(bb, candi[i].second)) == hist.end())
							{
								newcandi.push_back(pair<int, int>(bb, candi[i].second));
								hist.insert(pair<int, int>(bb, candi[i].second));
							}
						}
					}
				}
			}
			else
			{
				int j1max = -1;
				int a1= nums1.size()-candi[i].first;
				int a2= nums2.size()-candi[i].second;
				j1max = a1 + a2 - k <= a1 - 1 ? a1 + a2 - k + candi[i].first : a1 - 1 + candi[i].first;
				for (int j = candi[i].first; j <= j1max; j++)
					if (nums1[j] > choose1)
					{
					choose1 =nums1[j];
					ptr1 = j;
					}
				int j2max = -1;
				j2max = a1 + a2 - k <= a2 - 1 ? a1 + a2 - k + candi[i].second : a2 - 1 + candi[i].second;
				for (int j = candi[i].second; j <= j2max; j++)
					if (nums2[j] > choose2)
					{
					choose2 = nums2[j];
					ptr2 = j;
					}
				int gt = choose1 > choose2 ? choose1 : choose2;
				if (gt >= maxret)
				{
					if (gt > maxret)
					{
						newcandi.clear();
						maxret = gt;
					}
					if (choose1 > choose2)
					{
						int aa = ptr1+1;
						if (hist.find(pair<int, int>(aa, candi[i].second)) == hist.end())
						{
							newcandi.push_back(pair<int, int>(aa, candi[i].second));
							hist.insert(pair<int, int>(aa, candi[i].second));
						}
					}
					else if (choose1 < choose2)
					{
						int aa = ptr2+1;
						if (hist.find(pair<int, int>( candi[i].first,aa)) == hist.end())
						{
							newcandi.push_back(pair<int, int>(candi[i].first,aa));
							hist.insert(pair<int, int>( candi[i].first,aa));
						}
					}
					else
					{
						int aa = ptr2+1;
						if (hist.find(pair<int, int>(candi[i].first,aa)) == hist.end())
						{
							newcandi.push_back(pair<int, int>(candi[i].first,aa));
							hist.insert(pair<int, int>(candi[i].first,aa));
						}

						int bb = ptr1+1;
						if (hist.find(pair<int, int>(bb, candi[i].second)) == hist.end())
						{
							newcandi.push_back(pair<int, int>(bb, candi[i].second));
							hist.insert(pair<int, int>(bb, candi[i].second));
						}
					}
				}
			}
		}
		candi = newcandi;
		return maxret;
	}
	vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k)
	{
		vector<int>re;
		vector<pair<int, int>>candi;
		candi.push_back(pair<int, int>(0, 0));
		set<pair<int, int>>hist;
		while (k > 0)
		{
			re.push_back(do_once(nums1,nums2,candi, k,hist));
			k--;
		}
		return re;
	}
};


accepted



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值