Содержание

35. Search Insert Position

Условие

Дан отсортированный массив целых чисел и исходное число. Необходимо вернуть индекс элемента, если исходное число есть в массиве или индекс куда необходимо поставить исходное число.

Гарантируется, что дублей в массиве не будет.

Пример 1

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

Пример 2

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

Пример 3

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

Пример 4

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

Решение

Бинарный поиск

Будем использовать бинарный поиск с некоторыми дополнениями:

  • Вернуть 0 если исходное число меньше nums[0]
  • Вернуть len(nums) если исходное число больше nums[len(nums)-1]
  • Там где обычно в конце алгоримта возвращаем -1 ( элемент не найден ) – вернуть left
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
func searchInsert(nums []int, target int) int {
    left := 0
    right:=len(nums)-1
    if target>nums[right] {
        return len(nums)
    }
    if target < nums[left] {
        return 0
    }
    for left<=right {
        med := (left+right)/2
        if nums[med] == target {
            return med
        }
        if nums[med]>target {
            right=med-1
            continue
        }
        if nums[med]<target {
            left=med+1
            continue
        }   
    }
    return left
}