标签:问题 highlight return span 最小值 一个 nts back auto
问题:
给定一个数组,对所有元素进行,按大小排名rank,同样大小排名相同。
Example 1: Input: arr = [40,10,20,30] Output: [4,1,2,3] Explanation: 40 is the largest element. 10 is the smallest. 20 is the second smallest. 30 is the third smallest. Example 2: Input: arr = [100,100,100] Output: [1,1,1] Explanation: Same elements share the same rank. Example 3: Input: arr = [37,12,28,9,100,56,80,5,12] Output: [5,3,4,2,8,6,7,1,3] Constraints: 0 <= arr.length <= 105 -109 <= arr[i] <= 109
解法:
解法一:
将原数组的元素和index共同记录的情况下,根据元素进行排序。
这里使用排序map。对key=元素值,value=拥有相同元素值的index列表。
按照排序顺序(顺序遍历map),对原数组对应的index上的值从1开始递增赋值。
代码参考:
1 class Solution { 2 public: 3 vector<int> arrayRankTransform(vector<int>& arr) { 4 map<int, vector<int>>arrmap; 5 for(int i=0; i<arr.size(); i++){ 6 arrmap[arr[i]].push_back(i); 7 } 8 int i=1; 9 for(auto am:arrmap){ 10 for(auto idx:am.second){ 11 arr[idx]=i; 12 } 13 i++; 14 } 15 return arr; 16 } 17 };
解法二:
求出原数组的最大值maxv和最小值minv
所有元素,相对于最小值minv都有一个差值diff
将这个差值记录下来,成为数组diff[],这个数组的size为:maxv-minv+1
遍历原数组,记录所有元素和minv的差值。
然后遍历,所得差值数组,差值从0开始,对diff[i]>0(存在diff[i]个元素和minv的差值 i )的,
进行从1开始的rank排序:diff[i]=rank。
则得到,与minv差值为 i 的元素应该排 第diff[i]名
再遍历原数组arr
arr[i]=diff[arr[i]-minv]
元素arr[i]所排名次,应为,它与minv差值(arr[i]-minv)索引下的diff[]。
代码参考:
1 class Solution { 2 public: 3 vector<int> arrayRankTransform(vector<int>& arr) { 4 int maxv=INT_MIN, minv=INT_MAX; 5 if(arr.size()==0) return arr; 6 for(int a:arr){ 7 maxv=max(maxv,a); 8 minv=min(minv,a); 9 } 10 vector<int>diff(maxv-minv+1,0); 11 for(int a:arr){ 12 diff[a-minv]++; 13 } 14 int rank=1; 15 for(int i=0;i<diff.size();i++){ 16 if(diff[i]>0){ 17 diff[i]=rank; 18 rank++; 19 } 20 } 21 for(int i=0; i<arr.size(); i++){ 22 arr[i]=diff[arr[i]-minv]; 23 } 24 25 return arr; 26 } 27 };
1331. Rank Transform of an Array
标签:问题 highlight return span 最小值 一个 nts back auto
原文地址:https://www.cnblogs.com/habibah-chang/p/13234827.html