315. 计算右侧小于当前元素的个数
生活随笔
收集整理的這篇文章主要介紹了
315. 计算右侧小于当前元素的个数
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
315. 計(jì)算右側(cè)小于當(dāng)前元素的個(gè)數(shù)
給定一個(gè)整數(shù)數(shù)組 nums,按要求返回一個(gè)新數(shù)組 counts。數(shù)組 counts 有該性質(zhì): counts[i] 的值是 nums[i] 右側(cè)小于 nums[i] 的元素的數(shù)量。
示例:
輸入:nums = [5,2,6,1]
輸出:[2,1,1,0]
解釋:
5 的右側(cè)有 2 個(gè)更小的元素 (2 和 1)
2 的右側(cè)僅有 1 個(gè)更小的元素 (1)
6 的右側(cè)有 1 個(gè)更小的元素 (1)
1 的右側(cè)有 0 個(gè)更小的元素
解題思路
使用歸并排序,每一次合并的時(shí)候,對(duì)于左區(qū)間的每個(gè)元素,根據(jù)右區(qū)間指針的位置我們可以得出,右區(qū)間存在多少個(gè)大于當(dāng)前元素的(即在當(dāng)前元素前已經(jīng)被合并的元素個(gè)數(shù))。
使用一個(gè)額外的index數(shù)組,記錄下每個(gè)元素在原數(shù)組的下標(biāo),使得我們可以將對(duì)應(yīng)的結(jié)果加入到答案數(shù)組中
代碼
class Solution {int[] idx;int[] res;public List<Integer> countSmaller(int[] nums) {int n=nums.length;idx=new int[n];res=new int[n];for(int i=0;i<n;i++)idx[i]=i;List<Integer> list=new ArrayList<>();mergeSort(nums,0,n-1);for(int i=0;i<n;i++)list.add(res[i]);return list;}public void mergeSort(int[] nums,int l,int r){if(l<r){int mid=(r-l)/2+l;mergeSort(nums,l,mid);mergeSort(nums,mid+1,r);merge(nums,l,mid,r);}}public void merge(int[] nums,int l,int mid,int r){int i=l,j=mid+1,p=0;int[] t=new int[r-l+1];int[] ni=new int[r-l+1];while(i<=mid&&j<=r){if(nums[i]<=nums[j]){res[idx[i]]+=(j-mid-1);t[p]=nums[i];ni[p]=idx[i];p++;i++;}else {t[p]=nums[j];ni[p]=idx[j];p++;j++;}}while(i<=mid){res[idx[i]]+=(j-mid-1);t[p]=nums[i];ni[p]=idx[i];p++;i++;}while(j<=r){t[p]=nums[j];ni[p]=idx[j];p++;j++;}for(int k=0;k<r-l+1;k++){idx[k+l]=ni[k];nums[k+l]=t[k];}} }總結(jié)
以上是生活随笔為你收集整理的315. 计算右侧小于当前元素的个数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 164. 最大间距
- 下一篇: 600. 不含连续1的非负整数