Положение вставки Поиск (Java)

титульный

Учитывая упорядоченный массив и цель, найти объект в массиве и возвращает его индекс. Если цель не присутствует в массиве, он будет возвращен в последовательности вставляется положение.
Можно предположить , что нет повторяющихся элементов в массиве.

Пример 1:

输入: [1,3,5,6], 5
输出: 2

Пример 2:

输入: [1,3,5,6], 2
输出: 1

Пример 3:

输入: [1,3,5,6], 7
输出: 4

Пример 4:

输入: [1,3,5,6], 0
输出: 0

Алгоритмы и идеи

В два этапа: на
первом этапе, чтобы найти цель в массиве, и возвращает его индекс;
второй шаг, из массива, он будет возвращен в последовательности вставляется положение.

	/**search-insert-position-两次循环法*/
	public int searchInsert_1(int[] nums, int target) {
		int index = indexOf(nums,target);
		if(index!=-1) {
			return index;
		}
		return insert(nums,target);
	}

	/**查询索引*/
	private int indexOf(int[] nums, int target) {
		for (int i = 0; i < nums.length; i++) {
			if(nums[i]==target) {
				return i;
			}
		}
		return -1;
	}

	/**插入*/
	private int insert(int[] nums, int target) {
		int j=0;
		for (j = 0; j < nums.length; j++) {
			if(nums[j]>target) {
				break;
			}
		}
		return j;
	}	

После тщательного анализа этой темы, вы можете также найти шаг. До тех пор , как массив, больше или равно , чтобы найти targetиндекс элемента может.

	/**search-insert-position-一次循环法*/
	public int searchInsert_2(int[] nums, int target) {
		int i;
		for (i = 0; i < nums.length; i++) {
			if(nums[i]>=target)return i;
		}
		return i;
	}

Дальнейшая оптимизация использования двоичного алгоритма поиска

class Solution {

	public int searchInsert(int[] nums, int target) {
		if(target<nums[0]) {
			return 0;
		}else if(target>nums[nums.length-1]) {
			return nums.length;
		}
		int left = 0;
		int right = nums.length-1;
		int mid = right >>> 1;
		int leftP = -1;
		//先找最上位置
		while(left<=right) {
			if(nums[left]==target) {
				leftP = left;
				break;
			}else if(right<=left+1) {
				//避免死循环
				leftP = right;
				break;
			}
			if(nums[left]<target && target <=nums[mid]) {
				right = mid;
			}else if(nums[mid]<target && target <=nums[right]) {
				left = mid;
			}
			mid = (left+right) >>> 1;
		}
		return leftP;
	}
}
Опубликовано 151 оригинальные статьи · вона похвала 47 · Просмотров 230,000 +

рекомендация

отblog.csdn.net/e891377/article/details/103781158