码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode 315. Count of Smaller Numbers After Self

时间:2016-04-29 14:08:39      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:

 

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]

 

 1 class Solution {
 2 public:
 3  struct Node
 4 {
 5     int index;
 6     int num;
 7     Node(int a,int b)
 8     {
 9         index =a;
10         num =b;
11     }
12 };
13 
14 void mergesort(vector<Node>& nums,int start,int end,vector<int>&res)
15 {
16     
17     if(start==end)
18         return;
19     if(start+1==end)
20     {
21         if(nums[start].num>nums[end].num)
22         {
23             Node tmp(1,1) ;
24             res[nums[start].index]++;
25             tmp = nums[start];
26             nums[start] = nums[end];
27             nums[end] = tmp;
28             return;
29         }
30     }
31     
32     int middle = (start+end)/2;
33     mergesort(nums,start,middle,res);
34     mergesort(nums,middle+1,end,res);
35     
36     int s1 = start;
37     int s2 = middle+1;
38     vector<int>right;
39     vector<Node> pac;
40     while(s1<=middle || s2<=end)
41     {
42         
43         if(s1<=middle &&s2<=end)
44         {
45             if(nums[s1].num<=nums[s2].num)
46             {
47                 pac.push_back(nums[s1]);
48             
49                 res[nums[s1].index]+=right.size();
50                 s1++;
51             }
52             else
53             {
54                 pac.push_back(nums[s2]);
55                 right.push_back(nums[s2].num);
56                 s2++;
57             }
58         }
59         else if(s1<=middle)
60         {
61             pac.push_back(nums[s1]);
62             
63                 res[nums[s1].index]+=right.size();
64             s1++;
65         }
66         else if(s2<=end)
67         {
68             pac.push_back(nums[s2]);
69             right.push_back(nums[s2].num);
70             s2++;
71         }
72     }
73     for(int i=start;i<=end;i++)
74     {
75         nums[i]=pac[i-start];
76     }
77 
78 }
79  vector<int> countSmaller(vector<int>& nums) {
80 
81      int n = nums.size();
82      vector<int>res;
83      vector<Node>nodes;
84      if(n==0)
85          return res;
86      res.resize(n,0);
87      for(int i=0;i<n;i++)
88      {
89          nodes.push_back(Node(i,nums[i]));
90      }
91       mergesort(nodes,0,n-1,res);
92       return res;
93 
94         
95  }
96 
97 
98 };

 

leetcode 315. Count of Smaller Numbers After Self

标签:

原文地址:http://www.cnblogs.com/julyfrost/p/5445680.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!