牛客网面试算法题精讲第二季专题1
来源:互联网 发布:360回收站恢复软件 编辑:程序博客网 时间:2024/05/12 08:42
package niuke;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;/** * Created by sunnylinner on 2016/9/20. * * 给定一个 N*2的二维数组,看作是一个个二元组,例如[[a1,b1],[a2,b2],[a3,b3]],规定:一个如果想把二元组甲放在二元组乙上,甲中的a值必须大于乙中的a值, * 甲中的b值必须大于乙中的 b 值。如果在二维数组中随意选择二元组,请问二元组最多可以往上摞几个? * 例如:[[5,4],[6,4],[6,7],[2,3]],最大数量可以摞3个,[2,3] => [5,4] => [6,7]要求:实现时间复杂度O(N*logN)的解法 * * * 根据一维最长递增子序列思路求解 一维最长递增子序列 * 1:先排序:规则如下 * 按照x升序排列 如果x相等按照y降序排序 因为不能这样摞[6,4]=》[6,7],所以排序后[6,7]=》[6,4] * 2:对y求最长递增子序列 * 时间复杂度nlogn */public class Solution1 { static class Node{ int x; int y; public Node(int x, int y){ this.x = x; this.y = y; } @Override public String toString() { return "Node{" + "x=" + x + ", y=" + y + '}'; } } private static Comparator<Node> comparator = new Comparator<Node>() { @Override public int compare(Node l, Node r) { if (r.x > l.x) // 按照x升序排列 return -1; else if (r.x < l.x) return 1; else { if (r.y > l.y) return 1; else return -1; } } }; public static void main(String args[]) { Solution1 s = new Solution1(); Node n1 = new Node(6, 4); Node n2 = new Node(6, 7); Node n3 = new Node(5, 4); Node n4 = new Node(5, 7); Node n5 = new Node(4, 7); Node n6 = new Node(2, 3); List<Node> list = new ArrayList<>(); List<Node> help = new ArrayList<>(); list.add(n1); list.add(n2); list.add(n3); list.add(n4); list.add(n5); list.add(n6); Collections.sort(list, comparator); System.out.println("排序后的结果"); for (Node n : list) System.out.println(n.toString()); System.out.println(); int flag = 0; for (Node n : list) { if (help.isEmpty() || help.get(help.size() - 1).y < n.y) { help.add(n); } else { int l = 0; int r = help.size(); while (l <= r) { // 二分法 int mid = l + (r-1)>>1; if (n.y == help.get(mid).y) { // 如果已经存在就不添加了 flag = 1; break; } else if (n.y > help.get(mid).y) { l = mid + 1; } else { r = mid - 1; } } System.out.println("r: " + r); System.out.println("l: " + l); if (flag == 1) { flag = 0; } else { Node remove = help.remove(l); help.add(l, n); } } } System.out.println("最大个数:" + help.size()); for (Node n : help) { System.out.println(n.toString()); } }}
0 0
- 牛客网面试算法题精讲第二季专题1
- 《牛客面试算法题精讲第二季》专题1
- 《牛客面试算法题精讲第二季》专题3
- 第二专题总结(搜索算法)
- android面试专题(1)
- 面试专题
- 牛客网(直通BAT面试算法班) 第三章,字符串,专题系列 Day4
- 面试题目 链表专题 - 数据结构与算法
- 面试专题1----------链表(单链表)
- 算法专题:DP(1)
- 牛客网(直通BAT面试算法班) 第二章,排序上,Day2
- 牛客网(直通BAT面试算法班) 第二章,排序下,Day3
- 第二专题总结
- 专题三 第二题
- Java 面试专题
- 面试题目 字符串专题
- 【面试】字符串专题
- 面试题目 字符串专题
- uva 10779 Collectors Problem(最大流,好题)
- 前端学习---字符集
- AD转换与DA转换的应用
- linux内存屏障浅析
- 博客导读
- 牛客网面试算法题精讲第二季专题1
- HTML5学习_day01(6)--html颜色的几种写法
- 常用知识篇 一 Selector state状态对应说明
- 文章标题
- HDU 5880 Family View
- easyui使用总结(各种注意的小细节) 持续更新
- 视图控制器push下一级控制器, 下级视图向下偏移64
- Android--通知之Toast
- Socket通信笔记