[LeetCode]493. Reverse Pairs
来源:互联网 发布:安卓导航软件 编辑:程序博客网 时间:2024/06/05 01:02
https://leetcode.com/problems/reverse-pairs/?tab=Description
找出满足i < j && nums[i] > 2 * nums[j]的所有对数
树状数组:
public class Solution { public int reversePairs(int[] nums) { int[] copy = Arrays.copyOf(nums, nums.length); int[] bit = new int[nums.length + 1]; Arrays.sort(copy); int res = 0; for (int num : nums) { res += search(bit, index(copy, 2L * num + 1)); insert(bit, index(copy, num)); } return res; } // 找比当前值大的,要往后找 private int search(int[] bit, int i) { int sum = 0; while (i < bit.length) { sum += bit[i]; i += (i & -i); } return sum; } // 更新所有小于等于位置i的值所在的bit private void insert(int[] bit, int i) { while (i > 0) { bit[i]++; i -= (i & -i); } } private int index(int[] nums, long val) { int i = 0; int j = nums.length - 1; while (i <= j) { int mid = i + (j - i) / 2; if (nums[mid] >= val) { j = mid - 1; } else { i = mid + 1; } } // 返回bit内的index,要加一 return i + 1; }}
BST,在[0, 1, 2, 3.....]大数据量时会超时,主要看思路
public class Solution { public int reversePairs(int[] nums) { int cnt = 0; TreeNode root = null; for (int num : nums) { cnt += search(root, 2L * num + 1); root = insert(num, root); } return cnt; } private TreeNode insert(int val, TreeNode root) { if (root == null) { return new TreeNode(val); } else if (val == root.val) { root.cnt++; } else if (root.val > val) { root.left = insert(val, root.left); } else { root.cnt++; root.right = insert(val, root.right); } return root; } private int search(TreeNode root, long val) { if (root == null) { return 0; } else if (root.val == val) { return root.cnt; } else if (root.val > val) { return root.cnt + search(root.left, val); } else { return search(root.right, val); } }}class TreeNode { int val; int cnt; TreeNode left; TreeNode right; public TreeNode(int val) { this.val = val; this.cnt = 1; }}
归并排序,合并过程中从左右两个子数组中找到满足条件的对数,因为i < j始终满足,只要找nums[i] > 2 * nums[j]即可
public class Solution { public int reversePairs(int[] nums) { return reversePairs(nums, 0, nums.length - 1); } private int reversePairs(int[] nums, int beg, int end) { if (beg >= end) { return 0; } int l = beg; int m = beg + (end - beg) / 2; int r = m + 1; int p = m + 1; int[] merge = new int[end - beg + 1]; int k = 0; int res = reversePairs(nums, beg, m) + reversePairs(nums, m + 1, end); while (l <= m) { while (p <= end && nums[l] > 2L * nums[p]) { p++; } res += p - (m + 1); while (r <= end && nums[l] >= nums[r]) { merge[k++] = nums[r++]; } merge[k++] = nums[l++]; } while (r <= end) { merge[k++] = nums[r++]; } System.arraycopy(merge, 0, nums, beg, merge.length); return res; }}
0 0
- [LeetCode]493. Reverse Pairs
- leetCode:493. Reverse Pairs
- Leetcode:493. Reverse Pairs
- leetcode 493. Reverse Pairs
- [Leetcode] 493. Reverse Pairs 解题报告
- leetcode练习 Reverse Pairs
- leetcode改进 Reverse Pairs
- 493. Reverse Pairs
- 493. Reverse Pairs
- 493. Reverse Pairs
- 493. Reverse Pairs
- 493. Reverse Pairs
- [LeetCode]493. Reverse Pairs 深入浅出算法讲解和代码示例
- leetcode 493. Reverse Pairs 归并排序统计逆序对数量
- LeetCode week 1 : Reverse Pairs(493)
- Reverse Pairs
- 【分治算法】Leetcode编程题解:493. Reverse Pairs Add to List
- 来来来 再来一个逆序对 493. Reverse Pairs
- HTML5基础——表 单
- 【安装eclipse, 配置java环境教程】 编写第一个java程序
- CentOS7.2 安装php 7.1+workerman+MariaDB
- Linux下ngnix安装
- nat123内网映射到外网
- [LeetCode]493. Reverse Pairs
- (Java学习笔记1)链表
- mysql 字段类型
- 关于RN的直接操作和ref/refs的使用
- 【JZOJ 4986】 神秘物质
- H5前端框架总结
- hashMap为啥初始化容量为2的次幂
- Codeforces Round #401 (div. 2)解题报告
- java语言基础—字符串—java中字符串中的字符占用字节数分析