题目描述
考虑了一下,还是把这道题作为单独一篇文了。 主要是配合这篇题解一起理解二分法,实践太少理解还不够透彻,还是要温故知新= =
思路 & 代码
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; }
}
Summary
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],这种情况向上取整,防止 [mid, right] == [left, 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; }
}