活跃农民
- 积分
- 514
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2014-8-15
- 最后登录
- 1970-1-1
|
- class tt {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- int[] nums1 = { 8, 9, 10, 1, 2, 3, 4};
- int[] nums2 = { 8, 9, 10, 1, 2, 3};
- int[] nums3 = { 10, 9, 2, 5, 3, 7};
- Solution tt = new Solution();
- List<Integer> res = tt.LongestSortedSubrange(nums1, 3);
- for (int j = 0; j < res.size(); j++) {
- System.out.print(res.get(j) + "\t");
- }
- System.out.println();
- res = tt.LongestSortedSubrange(nums2, 3);
- for (int j = 0; j < res.size(); j++) {
- System.out.print(res.get(j) + "\t");
- }
- System.out.println();
- res = tt.LongestSortedSubrange(nums3, 3);
- for (int j = 0; j < res.size(); j++) {
- System.out.print(res.get(j) + "\t");
- }
- }
- }
- class Solution {
- public List<Integer> LongestSortedSubrange(int[] nums, int m) {
- List<Integer> res = new ArrayList<Integer>();
- if (nums == null || nums.length == 0) {
- return res;
- }
- //record every element idx
- Map<Integer, Integer> map = new HashMap<>();
- for (int i = 0; i < nums.length; i++) {
- map.put(nums[i], i);
- }
- Arrays.sort(nums);
- dfs(nums, m, res, new ArrayList<Integer>(), nums.length - 1, map);
- return res;
- }
- private void dfs(int[] nums, int m, List<Integer> res, List<Integer> cur, int pos, Map<Integer, Integer> map) {
- // get the longest one
- if (pos < 0 && m >= nums.length - cur.size() && cur.size() > res.size()) {
- res.clear();
- res.addAll(cur);
- return;
- }
- // get the biggest summation
- if (pos < 0 && m >= nums.length - cur.size() && cur.size() == res.size()) {
- int resSum = 0, curSum = 0;
- for (int i = 0; i < cur.size(); i++) {
- resSum += res.get(i);
- curSum += cur.get(i);
- }
- if (curSum > resSum) {
- res.clear();
- res.addAll(cur);
- }
- return;
- }
- for (int i = pos; i >= 0; i--) {
- //begin from last one, find the longest sub-sequence
- if (cur.isEmpty()) {
- cur.add(nums[i]);
- dfs(nums, m, res, cur, i - 1, map);
- cur.remove(0);
- }
- //the idx of i_th element greater than the idx of 0 element of cur
- //cannot contruct a increasing sub-sequence
- else if (map.get(nums[i]) > map.get(cur.get(0))) {
- if (i == 0) {
- dfs(nums, m, res, cur, i - 1, map);
- }
- }
- else {
- cur.add(0, nums[i]);
- dfs(nums, m, res, cur, i - 1, map);
- cur.remove(0);
- }
- }
- }
- }
复制代码 不确定是否正确,只测试了简单的例子
int[] nums1 = { 8, 9, 10, 1, 2, 3, 4};
tt.LongestSortedSubrange(nums1, 3);
1 2 3 4
int[] nums2 = { 8, 9, 10, 1, 2, 3};
res = tt.LongestSortedSubrange(nums2, 3);
8 9 10
int[] nums3 = { 10, 9, 2, 5, 3, 7};
res = tt.LongestSortedSubrange(nums3, 3);
2 5 7
有什么想法大家讨论一下 |
|