315. Count of Smaller Numbers After Self
二分查找流程,移动双指针,比较最后留存的指针所在的位置。
二分查找的思想很好理解,但是具体到写程序的时候,刚开始的时候一团糟,因为脑海中一直有一个很模糊地印象,那就是别人写的二分查找的流程,然后自己在写代码的时候一直在回忆这个流程,然而记忆总是将某一部分进行遗忘,只留下一些枝干,如果没有原始的思路,很难由这个枝干将整棵树进行复原。
最后具体理清楚了思路后,才是真正明白二分查找的结构应该这样写,最后加一减一为什么会这么设置,细枝末节确实不用记,但前提是懂为什么。
以上可能是我独有的疑惑。
import java.util.ArrayList;
import java.util.List;
public class Solution {
public List<Integer> countSmaller(int[] nums) {
int n = nums.length;
List<Integer> sorted = new ArrayList<Integer>();
Integer[] res = new Integer[n];
for(int i=n-1;i>=0;i--){
int num = nums[i];
int index = cntSmaller(num,sorted);
sorted.add(index,num);
res[i] = index;
}
return Arrays.asList(res);
}
public int cntSmaller(int num, List<Integer> sorted){
int len = sorted.size();
if(len==0) return 0;
int left = 0;
int right = len-1;
int mid = len/2;
if(sorted.get(left)>=num) return 0;
if(sorted.get(right)<num) return len;
while(left+1<right){
mid = (left+right)/2;
if(sorted.get(mid)>=num){
right = mid; //>=num
}else{
left = mid+1; //left-1<num
}
}
// left+1>=right ---> left+1 = right
if(sorted.get(left)>=num) return left; // before left
return right ;
}
}