leetcode 321. Create Maximum Number
2016-03-23 14:28
465 查看
Given two arrays of length
digits
You should try to optimize your time and space complexity.
Example 1:
nums1 =
nums2 =
k =
return
Example 2:
nums1 =
nums2 =
k =
return
Example 3:
nums1 =
nums2 =
k =
return
看到题先打个标签,贪心问题,大致思路有了,剩下就是程序设计的细节。
这题还算难点的。程序设计时往往需要考虑特例情况,在这一题中就要考虑某次可以从nums1和nums2里取出的最大的数相等的情况该怎么办,这时你如果死揪着这个不放就会陷入一个黑洞——如果往下算一层还是相等怎么办?这样程序写起来就会很复杂,而且不清晰,甚至根本写不出来。这时你就要换一个思路了。程序员要做的应该是简单的事,复杂的事嘛就交给计算机好了。这话说起来容易,其实要做到挺不容易,慢慢体会吧。
回到这个问题,非要在这次就得到一个唯一的答案吗?不必的。相等的话就都留下吧,留给下一次处理,不要妄想一次就把所有问题都解决,每次解决一点,每次都往正确解靠近就行。
accepted
mand
nwith
digits
0-9representing two numbers. Create the maximum number of length
k <= m + nfrom digits of the two. The relative order of the digits from the same array must be preserved. Return an array of the
kdigits.
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
相关文章推荐
- 理解MySQL存储过程和函数
- String.split()结尾空字符串将被丢弃
- Fragment详解(二):Fragment 与支持库
- Go时间格式化和类型互换操作
- PowerDesigner建模经验
- 关于IOS我要学的d
- Jedis 操作
- wait与waitpid
- Tags Layers
- 25. Reverse Nodes in k-Group
- 最强正则表达式
- iOS 分类(category)、扩展(Extension)
- 306. Additive Number
- jquery鼠标悬停时的放大图片的图片提示效果
- NOIp 2010 导弹拦截
- JSON.parse()方法
- 队列—队列的存储实现及运算实现
- SharePoint2013 IT Professional - Permission
- Redis命令总结
- Linux文件的打包与压缩