LeetCode代码分析——35. Search Insert Position(二分查找在找不到时的变种)

题目描述

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.
给定一个排序好的数组和target值,如果找到目标值就返回,如果没有找到就返回它在插入的时候应该有的位置。

You may assume no duplicates in the array.
数组元素不重复。

Example 1:

Input: [1,3,5,6], 5
Output: 2

Example 2:

Input: [1,3,5,6], 2
Output: 1

Example 3:

Input: [1,3,5,6], 7
Output: 4

Example 4:

Input: [1,3,5,6], 0
Output: 0

思路分析

二分查找的变种,而且是很简单的那种,只需要在找不到元素的时候考虑下该怎么做,例如Example 2,二分查找会沿着3-1,最后target > nums[mid],然后发现没有找到,所以需要上一步记录下mid + 1的位置,因此递归时需要额外的参数possible表示每次递归的下一次如果没有找到那么应该返回多少
当二分查找去[start, mid - 1]找的时候,possible置为mid;
当二分查找去[mid + 1, end]找的时候,possible置为mid + 1;

代码实现

public class Solution {

    /**
     * 62 / 62 test cases passed.
     *  Status: Accepted
     *  Runtime: 5 ms
     *
     * @param nums
     * @param target
     * @return
     */
    public int searchInsert(int[] nums, int target) {
        return findPosition(nums, 0, nums.length - 1, target, -1);
    }

    public int findPosition(int[] nums, int start, int end, int target, int possible) {

        if (start > end) {
            return possible;
        }

        int mid = (start + end) / 2;

        if (nums[mid] == target) {
            return mid;
        } else if (target < nums[mid]) {
            return findPosition(nums, start, mid - 1, target, mid);
        } else {
            return findPosition(nums, mid + 1, end, target, mid + 1);
        }

    }
}

你可能感兴趣的:(LeetCode代码分析——35. Search Insert Position(二分查找在找不到时的变种))