目录
一、题目
35.搜索插入位置 https://leetcode-cn.com/problems/search-insert-position/
二、想法
1.数组有序,查找插入位置 看题目就是标准的二叉查找算法
fun searchInsert(nums: IntArray, target: Int): Int {
var low = 0
var height = nums.size - 1
var middle= 0
while (low <= height) {
middle = (low + height) / 2
when {
nums[middle] == target -> {
return middle
}
nums[middle] > target -> {
height = middle - 1
}
else -> {
low = middle + 1
}
}
}
//这里要做一个判断,就是跟最后插入位置的值判断,
// 如果数组中数字大,则直接返回该位置,如果数组中数字小,则插入到该位置后面以为
return if (nums[middle] > target) {
middle
} else {
middle + 1
}
}
三、复杂度分析
时间复杂度:O(logN), 每次循环都会丢弃一半的查找空间 空间复杂度:O(1), 使用一个整数型变量mid来记录中间值
四、优秀解法
fun searchInsert(nums: IntArray, target: Int): Int {
var left = 0 //左指针
var right = nums.size - 1 //右指针
var middle= 0
while (left <= right) {
// int middle = (lo + hi) >>> 1; //高效,折半
/**
* 妙处:
* 防止索引值太大时,int溢出
*/
middle = left + ((right - left) shr 1)
when {
nums[middle] == target -> {
return middle
}
nums[middle] > target -> {
right = middle - 1
}
else -> {
left = middle + 1
}
}
}
/**
* 妙处:
* 返回左指针的位置是因为在查找的时候,
* 如果nums[left] > target, 那么插入的位置就是left当前索引的位置
* 如果num[left] < target,那么left索引在最后一次判断的时候索引会+1
* 所以可以直接返回left的位置!!
*/
return left
}
五、学到了什么
1. 二分查找法的思想就是有2个指针左右指针,通过择半查找法之后,移动左右指针的位置,跟目前值进行对比 |
2.标准的二分查找法的返回值是left左指针的位置及代表插入的位置! |