考虑了一下,还是把这道题作为单独一篇文了。 主要是配合这篇题解一起理解二分法,实践太少理解还不够透彻,还是要温故知新= = class  Solution  { public  int  searchInsert ( int [ ]  nums,  int  target)  { if ( target >  nums[ nums. length -  1 ] ) { return  nums. length; } int  left =  0 ,  right =  nums. length -  1 ; while ( left <  right) { int  mid =  left +  ( right -  left)  /  2 ; if ( nums[ mid]  <  target) { left =  mid +  1 ; } else { right =  mid; } } return  left; } 
} 
int mid = left + (right - left) / 2,可读性 & 防止 left + right 溢出。(位运算好像其实不会变快 区间划分,两种情况: left = mid + 1 && right = mid => [left, mid] && [mid + 1, right],这种情况 mid 要向下取整,防止[left, mid] == [left, right]的情况导致死循环 left = mid && right = mid - 1 => [left, mid - 1] && [mid, right],这种情况向上取整,防止 区间为什么不分成三个部分:结束时不一定有 left == right 出现死循环时,可以输出 left、right、mid来分析 更多内容可见这篇题解 很痛苦,上面的 Summary 真的很重要(特别是死循环 部分的向上取整、向下取整) class  Solution  { public  int  searchInsert ( int [ ]  nums,  int  target)  { if ( target >  nums[ nums. length -  1 ] )  { return  nums. length; } int  left =  0 ,  right =  nums. length -  1 ; while ( left <  right)  { int  mid =  ( left +  right)  /  2 ; if ( nums[ mid]  <  target)  { left =  mid +  1 ; } else  { right =  mid; } } return  left; } 
}