|
| 1 | +```text |
| 2 | +题目: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引; |
| 3 | + 如果目标值不存在于数组中,返回它将会被按顺序插入的位置; |
| 4 | + 示例1: |
| 5 | + 输入: [1,3,5,6], 5 |
| 6 | + 输出: 2 |
| 7 | + 示例2: |
| 8 | + 输入: [1,3,5,6], 2 |
| 9 | + 输出: 1 |
| 10 | + 示例 3: |
| 11 | + 输入: [1,3,5,6], 7 |
| 12 | + 输出: 4 |
| 13 | + 示例 4: |
| 14 | + 输入: [1,3,5,6], 0 |
| 15 | + 输出: 0 |
| 16 | +1.一次遍历: |
| 17 | + [1]思路: 有序数组可通过一次遍历与目标值比较确定下标 |
| 18 | + [2]实现: |
| 19 | + class Solution { |
| 20 | + public int searchInsert(int[] nums, int target) { |
| 21 | + for (int i = 0; i < nums.length; i++) { |
| 22 | + if (nums[i] >= target) { |
| 23 | + return i; |
| 24 | + } |
| 25 | + } |
| 26 | + return nums.length; |
| 27 | + } |
| 28 | + } |
| 29 | + [3]复杂度分析: |
| 30 | + (1)时间复杂度: O(N),N为数组的长度 |
| 31 | + (2)空间复杂度: O(1) |
| 32 | +2.二分法: |
| 33 | + [1]思路: |
| 34 | + (1)二分法是用来查询有序数组中是否含有指定元素 |
| 35 | + (2)由于不存在时要返回插入的位置,则有两种情况: |
| 36 | + 1)二分后的中间值等于目标值,此时返回中间值下标 |
| 37 | + 2)二分后,目标值处在左区间或右区间则保存区间的右边界值的下标, |
| 38 | + 循环往复直到不满足循环条件,最后保存的右边界值下标即插入位置 |
| 39 | + [2]实现: |
| 40 | + class Solution { |
| 41 | + public int searchInsert(int[] nums, int target) { |
| 42 | + int n = nums.length; |
| 43 | + // 定义数组左右边界指针和不存在时插入的位置变量 |
| 44 | + int left = 0, right = n - 1, ans = n; |
| 45 | + // 二分法查找 |
| 46 | + while (left <= right) { |
| 47 | + int mid = (right + left)/2; |
| 48 | + if(target == nums[mid]){ |
| 49 | + return mid; |
| 50 | + } |
| 51 | + if (target < nums[mid]) { |
| 52 | + // 一旦目标值所在区间的右边界缩小时,需要更新插入的位置 |
| 53 | + ans = mid; |
| 54 | + right = mid - 1; |
| 55 | + } else { |
| 56 | + left = mid + 1; |
| 57 | + } |
| 58 | + } |
| 59 | + return ans; |
| 60 | + } |
| 61 | + } |
| 62 | + [3]复杂度分析: |
| 63 | + (1)时间复杂度: O(lgN),N为数组的长度 |
| 64 | + (2)空间复杂度: O(1),常数个变量不影响 |
| 65 | +``` |
0 commit comments