Java实现 LeetCode 315 计算右侧小于当前元素的个数
315. 计算右侧小于当前元素的个数
给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。
示例:
输入: [5,2,6,1]
输出: [2,1,1,0]
解释:
5 的右侧有 2 个更小的元素 (2 和 1).
2 的右侧仅有 1 个更小的元素 (1).
6 的右侧有 1 个更小的元素 (1).
1 的右侧有 0 个更小的元素.
class Solution {
     public static  List<Integer> countSmaller(int[] nums) {
        if (nums.length == 0) {
            return new ArrayList<>();
        }
        int min = Integer.MAX_VALUE; // nums数组最小值
        for (int value : nums) {
            if (value < min) {
                min = value;
            }
        }
        for (int i = 0; i < nums.length; i++) {
            nums[i] = nums[i] - min + 1;
        }
        int max = Integer.MIN_VALUE;
        for (int value : nums) {
            if (value > max) {
                max = value;
            }
        }
        int[] BITree = new int[max + 1];
        BITree[0] = 0;
        int[] countArr = new int[nums.length];
        for (int i = nums.length - 1; i >= 0; i--) {
            int count = getSum(nums[i] - 1, BITree);
            countArr[i] = count;
            update(nums[i], BITree);
        }
        List<Integer> result = new ArrayList<>();
        for (int value : countArr) {
            result.add(value);
        }
        return result;
    }
    //获取和
    public static int getSum(int value, int[] BITree) { // 获得a[i]从1,value的和
        int sum = 0;
        while (value > 0) {
            sum += BITree[value];
            value -= (value & -value);
        }
        return sum;
    }
    //单点更新值
    public static void update(int value, int[] BITree) {
        while (value <= BITree.length - 1) {
            BITree[value] += 1;
            value += (value & -value);
        }
    }
//     public List<Integer> countSmaller(int[] nums) {
//         ArrayList<Integer> list = new ArrayList<Integer>();
//         int len = nums.length;
//         Integer[] result = new Integer[len];
//         for(int i = len-1;i>=0;i--) {
//             //将每个数插入到list中//使用二分查找
//             int start = 0; int end = list.size();
//             while(start<end) {
//                 int middle = start+(end-start)/2;
//                 //判断中间的数
//                 if(list.get(middle) < nums[i]) {//严格小于的话,只能在后面部分,并且不包含middle
//                     start = middle+1;
//                 }else {
//                     end = middle;
//                 }
//             }
//             result[i] = start;
//             list.add(start,nums[i]);
//         }
//         return Arrays.asList(result);
//     }
}
												
											Java实现 LeetCode 315 计算右侧小于当前元素的个数的更多相关文章
- Leetcode 315.计算右侧小于当前元素的个数
		
计算右侧小于当前元素的个数 给定一个整数数组 nums,按要求返回一个新数组 counts.数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元 ...
 - [Leetcode]315.计算右侧小于当前元素的个数 (6种方法)
		
链接 给定一个整数数组 nums,按要求返回一个新数组 counts.数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量. 示例: 输 ...
 - leetcode315 计算右侧小于当前元素的个数
		
1. 采用归并排序计算逆序数组对的方法来计算右侧更小的元素 time O(nlogn): 计算逆序对可以采用两种思路: a. 在左有序数组元素出列时计算右侧比该元素小的数字的数目为 cnt=r-mid ...
 - 315 Count of Smaller Numbers After Self 计算右侧小于当前元素的个数
		
给定一个整型数组 nums,按要求返回一个新的 counts 数组.数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于nums[i] 的元素的数量.例子:给定 nu ...
 - [Swift]LeetCode315. 计算右侧小于当前元素的个数 | Count of Smaller Numbers After Self
		
You are given an integer array nums and you have to return a new countsarray. The counts array has t ...
 - Java实现 LeetCode 357 计算各个位数不同的数字个数
		
357. 计算各个位数不同的数字个数 给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10n . 示例: 输入: 2 输出: 91 解释: 答案应为除去 11, ...
 - Leetcode 357.计算各个位数不同的数字个数
		
计算各个位数不同的数字个数 给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10n . 示例: 输入: 2 输出: 91 解释: 答案应为除去 11,22,33 ...
 - leetcode 357. 计算各个位数不同的数字个数(DFS,回溯,数学)
		
题目链接 357. 计算各个位数不同的数字个数 题意: 给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10n . 示例: 输入: 2 输出: 91 解释: 答 ...
 - Java实现 LeetCode 556 下一个更大元素 III(数组的翻转)
		
556. 下一个更大元素 III 给定一个32位正整数 n,你需要找到最小的32位整数,其与 n 中存在的位数完全相同,并且其值大于n.如果不存在这样的32位整数,则返回-1. 示例 1: 输入: 1 ...
 
随机推荐
- OpenCV 经纬法将鱼眼图像展开
			
文章目录 前言 理论部分 鱼眼展开流程 鱼眼标准坐标计算 标准坐标系与球坐标的转换 代码实现 测试效果如下图 总结 this demo on github 前言 鱼眼镜头相比传统的镜头,视角更广,采集 ...
 - Algorithms - Priority Queue - 优先队列
			
Priority queue - 优先队列 相关概念 Priority queue优先队列是一种用来维护由一组元素构成的集合S的数据结构, 其中的每一种元素都有一个相关的值,称为关键字(key). 一 ...
 - 1013 Battle Over Cities (25分) 图的连通分量+DFS
			
题目 It is vitally important to have all the cities connected by highways in a war. If a city is occup ...
 - Mysql 常用函数(9)- reverse 函数
			
Mysql常用函数的汇总,可看下面系列文章 https://www.cnblogs.com/poloyy/category/1765164.html reverse 的作用 将字符串反转,即顺序取反 ...
 - Python 的缩进是不是反人类的设计?
			
前些天,我写了<Python为什么使用缩进来划分代码块?>,文中详细梳理了 Python 采用缩进语法的 8 大原因.我极其喜欢这种简洁优雅的风格,所以对它赞美有加. 然而文章发出去后,非 ...
 - lsof 命令用法:查看已删除空间却没有释放的进程
			
查看已经删除的文件,空间有没有释放,没有的话kill掉pid lsof -n |grep deleted lsof简介lsof(list open files)是一个列出当前系统打开文件的工具. 问题 ...
 - WIn7系统下配置Java环境变量
			
给个官网下载地址 :https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 1.首先 ...
 - 2018-06-19 js DOM对象
			
DOM对象: Doucument Object Model即文档对象 DOM对象的操作: 1.找元素 返回元素对象: var obj=document.getElementById();//通过Id查 ...
 - 基于VUE实现的h5网页Web出库单入库单打印设计
			
经过将近一个月的研发,初步实现了打印单据的自定义设计,样子还有点丑陋,但是功能基本都实现了,实现了以下功能: 1.表头表尾支持动态添加行.添加列.合并单元格(可多行多列合并). 2.表头表尾分别布局, ...
 - 给DataTable添加行的几种方式
			
最近做项目的时候遇到向已有Table中添加另外一个Table中的某一行数据.我是采用这样思路做的: DataTable dtSource = xxxx;//获得的数据源 DataTable dtTar ...