leetcode oj java 315. Count of Smaller Numbers After Self

原创 2017年01月03日 23:03:58

一、问题描述

You are given an integer array nums and you have to return a new counts array. The counts array has the property where counts[i] is the number of smaller elements to the right of nums[i].

Example:

Given nums = [5, 2, 6, 1]

To the right of 5 there are 2 smaller elements (2 and 1).
To the right of 2 there is only 1 smaller element (1).
To the right of 6 there is 1 smaller element (1).
To the right of 1 there is 0 smaller element.

Return the array [2, 1, 1, 0].

二、解决思路:

暴力破解可以求出但是time limit. 因此我们需要寻找更加有效的方式:

从数组的最后一个开始遍历,二分搜索的方式放入新的数组中。新的数组从左到右升序排列。在每次放一个数字的时候记录下当前的位置k 即为原始数组中小于该元素的元素数目。

package T01;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 作者 : xcy
 * @version 创建时间:2017年1月3日 下午10:45:16
 *          类说明
 */
public class t315 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] nums = { 24, 30, 10, 3, 5, 13, 78, 100, 3, 5 };
        List<Integer> re = countSmaller(nums);
        for (int i : re) {
            System.out.println(i);
        }
    }

    public static List<Integer> countSmaller(int[] nums) {
        List<Integer> re = new ArrayList<Integer>();
        int len = nums.length;
        if (len == 0) {
            return re;
        }
        if (len == 1) {
            re.add(0);
            return re;
        }
        if (len == 2) {
            int id = nums[0] > nums[1] ? 1 : 0;
            re.add(id);
            re.add(0);
            return re;
        }
        int[] num = new int[len];
        List<Integer> copy = new ArrayList<Integer>();
        for (int i = len - 1; i >= 0; i--) {
            int left = 0, right = copy.size();
            while (left < right) {
                int mid = left + (right - left) / 2;
                if (copy.get(mid) >= nums[i])
                    right = mid;
                else
                    left = mid + 1;
            }
            num[i] = right;
            copy.add(right, nums[i]);
        }
        for (int i : num) {
            re.add(i);
        }
        return re;
    }

}


三、代码:


版权声明:本文为博主原创文章,未经博主允许不得转载。

LeetCode315—Count of Smaller Numbers After Self—Java版归并算法

这是我在研究leetcode的solution第一个解决算法时,自己做出的理解,并且为了大家能看懂,做出了详细的注释。 此算法算是剑指Offer36的升级版,都使用的归并算法,但是此处的算法,难度更...

LeetCode #315 Count of Smaller Numbers After Self

LeetCode #315 Count of Smaller Numbers After Self问题描述 给出一个整数序列,求解在这个序列中每个数字右边有多少个数字比当前数字小。 例子: G...

Leetcode 315. Count of Smaller Numbers After Self[hard]

题目: You are given an integer array nums and you have to return a new counts array. The counts array...

LeetCode 315. Count of Smaller Numbers After Self (逆序数对)

原题网址:https://leetcode.com/problems/count-of-smaller-numbers-after-self/ You are given an integer a...
  • jmspan
  • jmspan
  • 2016年04月22日 13:21
  • 1554

leetcode 315. Count of Smaller Numbers After Self

315. Count of Smaller Numbers After Self 线段树

剑指Offer 面试题36:数组中的逆序对及其变形(Leetcode 315. Count of Smaller Numbers After Self)题解

剑指Offer 面试题36:数组中的逆序对 题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 例如, 在数组{7,...

LeetCode 315. Count of Smaller Numbers After Self

又到一周更新时,这次的题目依旧来自LeetCode,由于这周老师还是讲的divide and conquer,按照以往的惯例,我从难度为hard的题目中挑选了一道通过率第二高的题,因为第一高的题上一次...
  • Ardenso
  • Ardenso
  • 2017年03月12日 15:11
  • 189

LeetCode 315 Count of Smaller Numbers After Self(树状数组)

LeetCode 315 Count of Smaller Numbers After Self(树状数组)

[leetcode] 315. Count of Smaller Numbers After Self 解题报告

题目链接: https://leetcode.com/problems/count-of-smaller-numbers-after-self/ You are given an integer ...

线段树&315 LeetCode:Count of Smaller Numbers After Self

一:线段树的基本概念线段树是一颗二叉搜索树,与区间树相似,讲一个区间划分成一些单元区间,每一个单元区间对应线段树中一个叶子节点 线段树上的每一个非叶子节点[a,b],它的左儿子表示区间为[a,(a+b...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:leetcode oj java 315. Count of Smaller Numbers After Self
举报原因:
原因补充:

(最多只允许输入30个字)