【LEETCODE】32、LeetCode的第35题,查找插入的位置

凉凉,看来想做好一个题还不容易啊。。。

有点难受。。。

1.看看题目吧

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.

给定一个有序数组,依旧是二分查找,不同之处是如果没有找到指定数字,需要返回这个数字应该插入的位置。

本来想想着不就二分查找嘛,分分钟搞定。。。结果悲剧了,小瞧了这题了,活活被气死

2.上代码

废话不多说了,可恶上代码吧

先来看看悲剧版本1:

class Solution {
    public int searchInsert(int[] nums, int target) {
        //这个题类似之前去小米面试的题,用二分查找
        int start = 0, end = nums.length - 1;
        int result = -1;

        while(start < end) {
            //注意判断当找到的位置值比target大,那么说明数据在左边,如果比target小,那么数据在右边
            int mid = (start +end)/2;

            if(nums[mid] == target) {
                result = mid;
                break;
            } else if(nums[mid] < target) {
                start = mid;
            } else {
                end = mid;
            }
        }

        //最后如果start == end
        if(start == end) {
            if(start == 0) {
                result = 0;
            } else if(nums[start] > target) {
                //如果这个时候比targe大,那么就是前一位
                result = start - 1;
            } else {
                result = start + 1;
            }
        }

        return result;
    }
}

简简单单,3分钟写完。。。然后分分钟悲剧。。。

兄弟们,这个玩意是个死循环。。。。

比如:最后start = 0, end = 1; 那么结果就是mid =0,start=0,end=1,MMP停不下来啊

问题在于,我们如果除数为0的话,那么start = mid,然后我们

nums[mid] < target的时候,start=mid 其实就是没变,还是等于start,永远不会达到条件start>=end的情况

悲剧版本2:
class Solution {
    public int searchInsert(int[] nums, int target) {
        //这个题类似之前去小米面试的题,用二分查找
        int start = 0, end = nums.length - 1;
        int result = -1;

        while(start < end) {
            //注意判断当找到的位置值比target大,那么说明数据在左边,如果比target小,那么数据在右边
            int mid = (start + end) / 2;

            if(nums[mid] == target) {
                result = mid;
                break;
            } else if(nums[mid] < target) {
                start = mid + 1;
            } else {
                end = mid;
            }
        }

        //最后如果start == end
        if(start == end) {
            if(start == 0) {
                result = 0;
            } else if(nums[start] > target) {
                //如果当前位置比这个值大,那么说明当前的值是用来取代这个位置的
                result = start;
            } else {
                //如果比这个值小,那么就应该往后移一位
                result = start + 1;
            }
        }

        return result;
    }
}

哎,一把辛酸泪,试试nums=[1],val=2吧,你会发现,循环根本没进去,然后start永远==0,那么结果就是0,MMP

行吧,行吧,我把start==0的判断去掉还不行么

悲剧版本3:
class Solution {
    public int searchInsert(int[] nums, int target) {
        //这个题类似之前去小米面试的题,用二分查找
        int start = 0, end = nums.length - 1;
        int result = -1;

        while(start < end) {
            //注意判断当找到的位置值比target大,那么说明数据在左边,如果比target小,那么数据在右边
            int mid = (start + end) / 2;

            if(nums[mid] == target) {
                result = mid;
                break;
            } else if(nums[mid] < target) {
                start = mid + 1;
            } else {
                end = mid;
            }
        }

        //最后如果start == end
        if(start == end) {
            if(nums[start] > target) {
                //如果当前位置比这个值大,那么说明当前的值是用来取代这个位置的
                result = start;
            } else {
                //如果比这个值小,那么就应该往后移一位
                result = start + 1;
            }
        }

        return result;
    }
}
哎呀,能不能一次到位啊,气死啦。。。。不说了nums={1},val = 1....好绝望啊,这个时候这个代码会返回1,为啥,我开始以为while找到了,但是没有返回,然后进入了下面的if判断

我改。。。

悲剧版本4:

class Solution {
    public int searchInsert(int[] nums, int target) {
        //这个题类似之前去小米面试的题,用二分查找
        int start = 0, end = nums.length - 1;
        int result = -1;

        while(start < end) {
            //注意判断当找到的位置值比target大,那么说明数据在左边,如果比target小,那么数据在右边
            int mid = (start + end) / 2;

            if(nums[mid] == target) {
                return mid;
            } else if(nums[mid] < target) {
                start = mid + 1;
            } else {
                end = mid;
            }
        }

        //最后如果start == end
        if(start == end) {
            if(nums[start] > target) {
                //如果当前位置比这个值大,那么说明当前的值是用来取代这个位置的
                result = start;
            } else {
                //如果比这个值小,那么就应该往后移一位
                result = start + 1;
            }
        }

        return result;
    }
}

他娘的,其实它while根本就没进去。。。。

绝望*n

哎,其实这里是漏掉了考虑没有进循环,然后start的位置正好就是找到了的位置。。。

改呗。。。

class Solution {
    public int searchInsert(int[] nums, int target) {
        //这个题类似之前去小米面试的题,用二分查找
        int start = 0, end = nums.length - 1;
        int result = -1;

        while(start < end) {
            //注意判断当找到的位置值比target大,那么说明数据在左边,如果比target小,那么数据在右边
            int mid = (start + end) / 2;

            if(nums[mid] == target) {
                return mid;
            } else if(nums[mid] < target) {
                start = mid + 1;
            } else {
                end = mid;
            }
        }

        //最后如果start == end
        if(start == end) {
            if(nums[start] >= target) {
                //如果当前位置比这个值大或相等,那么正好是这个位置,那么说明当前的值是用来取代这个位置的
                result = start;
            } else {
                //如果比这个值小,那么就应该往后移一位
                result = start + 1;
            }
        }

        return result;
    }
}

终于过关了。。。不容易啊

不过这里还可以优化一下运算,那就是用位运算取代/运算

class Solution {
    public int searchInsert(int[] nums, int target) {
        //这个题类似之前去小米面试的题,用二分查找
        int start = 0, end = nums.length - 1;
        int result = -1;

        while(start < end) {
            //注意判断当找到的位置值比target大,那么说明数据在左边,如果比target小,那么数据在右边
            int mid = start + ((end - start) >>> 1);

            if(nums[mid] == target) {
                return mid;
            } else if(nums[mid] < target) {
                start = mid + 1;
            } else {
                end = mid;
            }
        }

        //最后如果start == end
        if(start == end) {
            if(nums[start] >= target) {
                //如果当前位置比这个值大或相等,那么正好是这个位置,那么说明当前的值是用来取代这个位置的
                result = start;
            } else {
                //如果比这个值小,那么就应该往后移一位
                result = start + 1;
            }
        }

        return result;
    }
}

到这里就差不多了!!

原文地址:https://www.cnblogs.com/cutter-point/p/11112602.html

时间: 2024-10-31 16:05:27

【LEETCODE】32、LeetCode的第35题,查找插入的位置的相关文章

【LeetCode】- 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. 翻译:给你一个排好序的数组和一个目标值,请找出目标值可以插入数组的位置. [ 分析: ]

leetCode 第35题,搜索插入位置

题目概述 题目:力扣:35.搜索插入位置 难易:简单 内容: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 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 来源:力扣(LeetCode) 链接:https://

【LeetCode】BFS(共43题)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } [101]Symmetric Tree 判断一棵树是不是对称. 题解:直接递归判断了,感觉和bfs没有什么强联系,当然如果你一定要用queue改写的话,勉强也能算bfs. // 这个题目的重点是 比较对象是 左子树的左儿子和右子树的右儿子, 左子树的右儿子和右子树的左儿子.不要搞错. // 直接中序遍历的话会有错的情况,最蠢的情况是数字标注改一改.. 1 /** 2

【leetcode 简单】 第七十题 有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词. 示例 1: 输入: s = "anagram", t = "nagaram" 输出: true 示例 2: 输入: s = "rat", t = "car" 输出: false 说明: 你可以假设字符串只包含小写字母. 进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况? class Solution:

【leetcode 简单】 第七十一题 二叉树的所有路径

给定一个二叉树,返回所有从根节点到叶子节点的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 输入: 1 / 2 3 5 输出: ["1->2->5", "1->3"] 解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3 # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x

【leetcode 简单】 第七十七题 单词模式

给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式. 这里的遵循指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应模式. 示例1: 输入: pattern = "abba", str = "dog cat cat dog" 输出: true 示例 2: 输入:pattern = "abba", str = "dog cat cat fish&

【leetcode 简单】 第九十六题 最长回文串

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" 不能当做一个回文字符串. 注意: 假设字符串的长度不会超过 1010. 示例 1: 输入: "abccccdd" 输出: 7 解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7. class Solution(object): def longestPalindrome(self, s): &quo

LeetCode 32 括号匹配

[LeetCode 32] Longest Valid Parentheses 题目 Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring. 测试案例 Input: "(()" Output: 2 Explanation: The longest valid parenthese

[LC]35题 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], 5Output: 2Example