35. Search Insert Position(二分法)

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.

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

【分析】

这道题其实是二分法的变形,我在这里写了四种不同的二分法来实现题目要求,其中前两种是同一个思路,后两种是同一个思路:

写法一:

public int searchInsert(int[] nums, int target) {
        int start = 0;
        int end = nums.length;
        while (start < end) {
            int mid = (start + end) >> 1;
            int midNum = nums[mid];
            if (midNum < target) {
                start = mid + 1;
            } else {
                end = mid;
            }
        }
        return start;
    }

写法二:

public int searchInsert1(int[] nums, int target) {
        int start = 0;
        int end = nums.length - 1;
        int ans = nums.length;
        while (start <= end) {
            int mid = (start + end) >> 1;
            int midNum = nums[mid];

            if (midNum >= target) {
                ans = mid;
                end = mid - 1;
            } else {
                start = mid + 1;
            }
        }
        return ans;
    }

写法三:

public int searchInsert2(int[] nums, int target) {
        int start = 0;
        int end = nums.length - 1;
        while (start + 1 < end) {
            int mid = (end - start) / 2 + start;
            if (target < nums[mid]) end = mid;
            else if (target > nums[mid]) start = mid;
            else return mid;
        }
        if (target <= nums[start]) {
            return start;
        } else if (target <= nums[end]) {
            return end;
        } else {
            return end + 1;
        }
    }

写法四:

public int searchInsert3(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
            //int mid = (left + right)/2;
            int mid = (right - left) / 2 + left;
            if (nums[mid]==target) return mid;
            else if(nums[mid] > target) right = mid - 1;
            else left = mid + 1;
        }
        return left;
    }


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java数组是一种用于存储多个相同类型元素的数据结构。它可以存储基本数据类型(如int、float等)或者引用类型(如String、对象等)。数组在内存中是连续存储的,通过索引可以访问和修改数组中的元素。 二分法是一种高效的查找算法,适用于已排序的数组。它通过将数组分成两部分,然后判断目标元素在哪一部分中,从而缩小查找范围。具体步骤如下: 1. 确定数组的起始索引start和结束索引end。 2. 计算中间索引mid,即mid = (start + end) / 2。 3. 比较中间索引对应的元素与目标元素的大小关系: - 如果中间元素等于目标元素,则找到了目标元素,返回中间索引。 - 如果中间元素大于目标元素,则目标元素在左半部分,更新结束索引为mid - 1。 - 如果中间元素小于目标元素,则目标元素在右半部分,更新起始索引为mid + 1。 4. 重复步骤2和步骤3,直到找到目标元素或者起始索引大于结束索引。 对于给定的数组[0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],我们可以使用二分法查找第一个1的索引。具体步骤如下: 1. 起始索引start为0,结束索引end为13。 2. 计算中间索引mid,即mid = (0 + 13) / 2 = 6。 3. 比较中间索引对应的元素与目标元素1的大小关系: - 中间元素1等于目标元素1,但我们要找的是第一个1,所以更新结束索引为mid。 4. 重复步骤2和步骤3,直到找到目标元素或者起始索引大于结束索引。 5. 继续二分查找,此时起始索引start为0,结束索引end为6。 6. 计算中间索引mid,即mid = (0 + 6) / 2 = 3。 7. 比较中间索引对应的元素与目标元素1的大小关系: - 中间元素0小于目标元素1,更新起始索引为mid + 1。 8. 继续二分查找,此时起始索引start为4,结束索引end为6。 9. 计算中间索引mid,即mid = (4 + 6) / 2 = 5。 10. 比较中间索引对应的元素与目标元素1的大小关系: - 中间元素1等于目标元素1,但我们要找的是第一个1,所以更新结束索引为mid。 11. 继续二分查找,此时起始索引start为4,结束索引end为5。 12. 计算中间索引mid,即mid = (4 + 5) / 2 = 4。 13. 比较中间索引对应的元素与目标元素1的大小关系: - 中间元素1等于目标元素1,但我们要找的是第一个1,所以更新结束索引为mid。 14. 继续二分查找,此时起始索引start为4,结束索引end为4。 15. 起始索引等于结束索引,查找结束。返回起始索引4。 所以,在给定的数组中,使用二分法查找第一个1的索引为4。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值