力扣-35 搜索插入位置

    题目:

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

    你可以假设数组中无重复元素。

 

    如果用循环暴力,遍历处目标为止,应该也可解决问题,但是效率并不是最优。

    在开发中,时间复杂度从 n 到 log(n) 的进化是非常客观的,所以不应放过。

 

    这题的思想很简单,就是一个二分法查找。如果找不到,则找到应该插入的位置。

 

    隐约记得 C 或 C++ 中有一个这样的方法,直接调用即可。Java 有没有类似的方法,我没有探究,不过应该会有吧。

 

    二分法的思想十分简单,各位去网上查询即可,如果有机会,我也会总结一下二分法。就不在这里总结了。

 

    二分法大同小异,每个人的实现细节上可能有一些差别,不过只要不陷入死循环,基本上不影响整体效率。

 

    二分法中,通常都会让 r = m - 1 l = m + 1 我这里直接让 r = m 和 l = m ,目的是让 循环陷入死循环,然后判断如果陷入死循环,则跳出循环。这样,如果找不到 target 值,则得到的 m 值为 小于 target 的 最大的值的下标 ,这样只要 m + 1 就是插入位置了。

    下面是代码,看不懂的可以问我。

public int searchInsert(int[] nums, int target) {
		
		int l = 0, r = nums.length - 1;
		
		if(nums[r] < target)
			return nums.length;
		if(nums[l] > target)
			return 0;
		
		int m = -100;
		while(m != (l + r) / 2){
			m = (l + r) / 2;
			if(nums[m] > target){
				r = m;
			} else if(nums[m] < target) {
				l = m;
			} else {
				m--;
				break;
			}
		}
		return m + 1;
    }

 

你可能感兴趣的:(LeetCode)