[Binary Search]Search Insert Position
2015-12-16 16:32
260 查看
Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.
You may assume no duplicates in the array.
Here are few examples.
分析:将一个数插入到一个有序序列中,要求返回插入点索引。
方法一:直接查找法。由于数组已经是有序的,遍历数组nums,将数组中的元素nums[i]和target进行比较,由于数组是升序的,当target<nums[i],i即为target插入的位置。时间复杂度为O(n)
如果数组中不存在和target相当的元素,则当循环结束时,start值即为插入点索引。while循环执行的条件是start <= end,最后一轮循环时,start=end,对于索引为[0, start - 1]的元素,有target < nums[i];
对于索引为[end+1, nums.length - 1]的元素,有target < nums[i]。
因为start=end,所以有middle =
start = end,
当target > nums[middle],start = middle + 1 = end + 1, target < nums[end + 1],start = end + 1,即为target应该插入的位置;
当target < nums[middle],end = middle - 1 = start - 1,target >nums[start + 1],start =
middle,即为target应该插入的位置。
在有序数组中查找插入点的直接查找法和二分查找法,这也是直接插入排序和折半插入排序的基础。
You may assume no duplicates in the array.
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
分析:将一个数插入到一个有序序列中,要求返回插入点索引。
方法一:直接查找法。由于数组已经是有序的,遍历数组nums,将数组中的元素nums[i]和target进行比较,由于数组是升序的,当target<nums[i],i即为target插入的位置。时间复杂度为O(n)
public int searchInsert(int[] nums, int target) { for (int i = 0; i < nums.length; i++) { if (nums[i] >= target) return i; } return nums.length; }方法二:使用二分查找。时间复杂度为O(logn)。
public class Solution { public int searchInsert(int[] nums, int target) { if (nums.length == 0) { return 0; } int start = 0; int end = nums.length - 1; int middle = 0; while (start <= end) { middle =start + (end - start) / 2; if (nums[middle] == target) { return middle; } else if (target > nums[middle]) { start = middle + 1; } else { end = middle - 1; } } return start; } }
如果数组中不存在和target相当的元素,则当循环结束时,start值即为插入点索引。while循环执行的条件是start <= end,最后一轮循环时,start=end,对于索引为[0, start - 1]的元素,有target < nums[i];
对于索引为[end+1, nums.length - 1]的元素,有target < nums[i]。
因为start=end,所以有middle =
start = end,
当target > nums[middle],start = middle + 1 = end + 1, target < nums[end + 1],start = end + 1,即为target应该插入的位置;
当target < nums[middle],end = middle - 1 = start - 1,target >nums[start + 1],start =
middle,即为target应该插入的位置。
在有序数组中查找插入点的直接查找法和二分查找法,这也是直接插入排序和折半插入排序的基础。
相关文章推荐
- MD5总结
- Android 4.4.2 - java.lang.RuntimeException: Performing stop of activity that is not resumed
- jquery插件
- Python的流程控制
- Window ferformance toolkit 学习
- ehcache memcache redis 三大缓存男高音
- Angular2组件开发—表单输入(四)
- 设计模式部分总结
- 性能测试培训:定位jvm耗时函数
- ios开发——给uiview等设置圆角
- Android启动过程的底层实现
- 性能调优案例分享:jvm crash的原因 2
- 面相对象案例总结
- python os.system os.popen 区别
- java处理url中的特殊字符%等
- PVlan
- CSS3实现气泡效果
- netflix zuul 学习
- 王者-甄别同一板块强弱股的方法【真假美猴王】
- Oracle EBS环境下查找数据源(OAF篇)