leetcode首题! 35. Search Insert Position 搜索插入位置

今天是第一次刷leetcode的题目,刚开始接触有些困难。从今天开始每天至少一题(有时间就写笔记)。希望坚持下去,加油!
35. Search Insert Position
Description:
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

源码:

版本一

class Solution {
    public int searchInsert(int[] nums, int target) {
        int flag=-1;
        if(nums.length==1){
            if(target>nums[0])
                flag =1;
            else
                flag =0;
        }
        else{
        for(int i=0; i<nums.length-1; i++){
            if(target>nums[i] && nums[i+1]>=target){
                flag=i+1;
                break;
            }
            else if(target<=nums[i]){
                flag=i;  
                break;
            }    
            else 
                flag = i+2;
        }  
             }
        return flag;
 }
}

这是我一开始写的,思路不是很清楚,容易漏掉特殊情况的输入,如边界值、数组长度为1等等。

版本二

class Solution {
    public int searchInsert(int[] nums, int target) {
        int low=0,high=nums.length-1;
        while(low<=high){
            int mid = (low+high)/2;
            if(nums[mid]==target) return mid;
              else if(nums[mid]>target) high=mid-1;
                   else 
                       low=mid+1;
        }
        return low;
}
}

这是在讨论区看到的用二分查找法做的,比较简洁而且时间复杂度小 O(log2n),拿来学习一下。
二分查找:给定数组是有序的,给定一个key值。每次查找最中间的值,如果相等,就返回对应下标,如果key大于最中间的值,则在数组的右半边继续查找,如果小于,则在数组左半边查找,。最终有两种结果,一种是找到并返回下标,第二种是没找到。
定义两个边界下标low和high,定义中间下标mid;
low=0; high=size-1; mid = (low+high)/2;
在进行每一步的比较时,low<=high;

由于题目的要求,在找不到匹配值时返回要插入的位置,所以在最后返回low
这里稍微解释一下为什么是返回low?
当查找范围缩小到high=low+1时,mid=low,
如果nums[mid]<target low=mid+1=high,此时返回low或high都可以。
如果nums[mid]>target high=mid-1=low-1,此时应返回low。

版本三

class Solution {
   public int searchInsert(int[] nums, int target) {
    for (int i = 0; i < nums.length; i++) {
        if (nums[i] >= target)
            return i;
    }
    return nums.length;
}
}

这种思路也是不错,代码简洁!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值