首页 > 试题广场 >

搜索插入位置

[编程题]搜索插入位置
  • 热度指数:11228 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给出一个有序的数组和一个目标值,如果数组中存在该目标值,则返回该目标值的下标。如果数组中不存在该目标值,则返回如果将该目标值插入这个数组应该插入的位置的下标
假设数组中没有重复项。
下面给出几个样例:
[10,30,50,60], 50 → 2
[10,30,50,60], 20 → 1
[10,30,50,60], 70 → 4
[10,30,50,60], 0 → 0
示例1

输入

[10,30,50,60],50

输出

2
import java.util.*;


public class Solution {
    int index = -1;

    /**
     * 
     * @param A int整型一维数组 
     * @param target int整型 
     * @return int整型
     */
    public int searchInsert (int[] nums, int target) {
        // write code here
        searchHelper(nums, 0, nums.length - 1, target);
		return index;
    }
    public void searchHelper(int[] nums, int left, int right, int target) {
		if (left > right) {
			// 如果没有该元素,则返回left的值(自己画一下就知道了)
			index = left;
			return;
		}
		int mid = (right - left) / 2 + left;
		if (nums[mid] == target) {
			index = mid;
			return;
		} else if (nums[mid] < target) {
			searchHelper(nums, mid + 1, right, target);
		} else {
			searchHelper(nums, left, mid - 1, target);
		}
	}
}

发表于 2020-08-01 11:18:39 回复(0)
解法一:
public class Solution {
    public int searchInsert(int[] A, int target) {
//循环遍历数组,若目标数target小于等于A[i],则返回下标i,若循环能走完,则目标数target比数组最后一个数还要大,直接返回len+1
        int len= A.length;
        for(int i = 0; i < len; i++){
            if(A[i] >= target){
                return i;
            }
        }
        return len;
    }
}
解法二:
public class Solution {
    public int searchInsert(int[] A, int target) {
        //二分法查找
        int low = 0;
        int high = A.length - 1;
        while(low <= high){
            int mid = (low + high)/2;
            if(A[mid] == target)
                return mid;
            else if(A[mid] < target)
                low = mid + 1;
            else
                high = mid - 1;
        }
        return low;
    }
}


编辑于 2019-06-26 10:30:26 回复(0)
public class Solution {
    public int searchInsert(int[] A, int target) {
        //发现插入索引,原数组有序
        int len = A.length;
        int index = 0;
        for(int i = 0;i<len;i++){
            if(A[i]<target){//查找比target小的数的个数,也就是index的值
                index++;
            }else{
                break;//一旦发现有数大于等于index就退出循环体
            }
        }
        return index;//返回index
    }
}
发表于 2018-05-10 21:15:03 回复(0)

二分查找法,最后对low下标的值做个判断,如果其大于等于target,则target插入在low下标,否则插入在low+1位置。

public class Solution {
    public int searchInsert(int[] A, int target) {
        if (A == null || A.length == 0)
            return 0;
        int low = 0;
        int high = A.length-1;
        int mid;
        while (low < high) {
            mid = (low + high) / 2;
            if (target == A[mid])
                return mid;
            if (target < A[mid])
                high = mid - 1;
            else
                low = mid + 1;
        }
        return (A[low] >= target) ? low : low + 1;
    }
}
发表于 2018-03-30 10:13:03 回复(0)
public class Solution {
    public int searchInsert(int[] A, int target) {
        int left = 0;
        int right = A.length-1;
        while(left <= right) {
            int mid = (left + right) / 2;
            if(target == A[mid])
                return mid;
            if(target > A[mid])
                left = mid + 1;
            else
                right = mid -1;
        }
        return left;
    }
}

发表于 2017-06-05 19:38:40 回复(0)
public class Solution {
    public int searchInsert(int[] A, int target) {
        // 二分查找
		int low = 0;
		int high = A.length - 1;
		while (low <= high) {
			int mid = (low + high) / 2;
			if(A[mid] == target) return mid;
			else if(A[mid] < target) low = mid + 1;
			else high = mid - 1;
		}
        // 没找到返回low,即插入位置
		return low;
	}
}
发表于 2017-03-26 16:56:54 回复(0)
 public int searchInsert(int[] A, int target) { int low = 0, high = A.length-1; while(low<=high){ int mid = (low+high)/2; if(A[mid] == target) return mid; else if(A[mid] > target) high = mid-1; else low = mid+1;
        } return low;
    }

发表于 2017-03-12 14:59:48 回复(0)
public class Solution {
    public int searchInsert(int[] A, int target) {
        if(target == 0){
            return 0;
        }else {
            for(int i = 0;i<A.length;i++){
                if(A[i] == target||A[i]>target){
                    return i;
                }
            }
        }
        return A.length;
    }
}
发表于 2016-09-07 19:37:11 回复(0)