例:
Here are few examples.
[1,3,5,6], 5 → 2
[1,3,5,6], 2 → 1
[1,3,5,6], 7 → 4
[1,3,5,6], 0 → 0
hmm...这题要做不难,要做的漂亮有点难。
最傻逼的方法当然是直接iterate 整个list。但是这样的话Run time O(n)。
要提升速度,想想比O(n)快的也就只有Binary Search了。 但是想到这里就会发现:妈的,binary search不是用来找存在的东西吗,找一个不存在的position是个什么鬼。
这里就要回归Binary search的核心思想了:假设我先looking for这个number。如果存在,return。如果没找到,一直shrink range. 如果low大于high的时候,证明他不存在。不存在的话返回low的值。
首先注意的是在binary search里, int low, mid, high都是指 position!
while (low <= high) 这里设置 <= 也是Tricky
int mid =(low+high)/2; //这个也属于基本套路,不需要思考要做到
关键的: if(A[mid] == target) 如果要插入的东西和mid位置上的一样。 return mid position 作为插入位置。
else if(A[mid] > target) high = mid-1;
else low = mid+1; low = mid+1;
}
return low; //关键
所以就是 如果binary search有找到一个一样的value, 那么返回那个position。因为要插入的数会被放在first one.
如果找不到一样的, 那么就是完全要生插入进去了。就是low position的位置
推理出这个其实不太容易,最好是通过简单的example看出来
[1 3] insert 2. low =0, high = 1, mid =0. while loop break的时候low = mid+1=1.
刚好2插入在position 1最合适。
到这里再一想while condition的设置就会发现太精妙了。如果是while(low<high),那么就不是这个效果了。