LeetCode算法题-Binary Search(Java实现)

这是悦乐书的第297次更新,第316篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第165题(顺位题号是704)。给定n个元素的排序(按升序)整数数组nums和目标值,编写一个函数来搜索nums中的目标。如果target存在,则返回其索引,否则返回-1。例如:

输入:nums = [-1,0,3,5,9,12],目标= 9

输出:4

说明:9存在于nums中,其索引为4

输入:nums = [-1,0,3,5,9,12],target = 2

输出:-1

说明:2在nums中不存在,因此返回-1

注意:

  • nums中的所有元素都是唯一的。
  • n将在[1,10000]范围内。
  • nums中每个元素的值将在[-9999,9999]范围内。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

使用二分查找。取数组的第一位和最后一位索引值,计算取出中间数做新索引,判断新索引对应的元素是否等于目标值,等于就直接返回新索引,小于就将开始索引重新赋值为中间索引加1,大于就将结束索引重新赋值为中间索引减1。

此解法的时间复杂度是O(log2(n)),空间复杂度是O(1)。

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

03 第二种解法

直接使用循环依次匹配,如果遍历完数组所有元素都没有匹配上,就返回-1。

此解法的时间复杂度是O(n),空间复杂度是O(1)。

public int search(int[] nums, int target) {
    if (target < nums[0] || target > nums[nums.length-1]) {
        return -1;
    }
    for (int i=0; i<nums.length; i++) {
        if (target == nums[i]) {
            return i;
        }
    }
    return -1;
}

04 第三种解法

因为数组元素的取值范围定了,我们可以使用新的数组,以旧数组元素值为索引,旧元素索引为值,最后以目标值为索引,在新数组中查找,如果其值为0,就返回-1,反之返回其值。

此解法的时间复杂度是O(n),空间复杂度是O(n)。

public int search(int[] nums, int target) {
    if (target < nums[0] || target > nums[nums.length-1]) {
        return -1;
    }
    int[] temp = new int[20000];
    for (int i=0; i<nums.length; i++) {
        temp[nums[i]+10000] = i+1;
    }
    return temp[target+10000] == 0 ? -1 : temp[target+10000]-1;
}

05 小结

算法专题目前已日更超过四个月,算法题文章165+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

原文地址:https://www.cnblogs.com/xiaochuan94/p/10656732.html

时间: 2024-07-29 21:54:17

LeetCode算法题-Binary Search(Java实现)的相关文章

LeetCode算法题-Binary Watch(Java实现)

这是悦乐书的第216次更新,第229篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第84题(顺位题号是401).二进制手表顶部有4个LED,代表小时(0-11),底部的6个LED代表分钟(0-59).每个LED代表一个零或一个,右侧的最低有效位.给定非负整数n表示当前打开的LED数量,返回手表可能代表的所有可能时间.例如: 输入:n = 1 输出:["1:00","2:00","4:00","8:00&qu

LeetCode算法题-Sqrt(Java实现)

这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型是整数,因此将截断十进制数字,并仅返回结果的整数部分.例如: 输入:4 输出:2 输入:8 输出:2 说明:8的平方根是2.82842 ...,从2以后小数部分被截断,返回2 本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试.

LeetCode Algorithms Questions List (LeetCode 算法题列表)- Java Solutions

因为在开始写这个博客之前,已经刷了100题了,所以现在还是有很多题目没有加进来,为了方便查找哪些没加进来,先列一个表可以比较清楚的查看,也方便给大家查找.如果有哪些题目的链接有错误,请大家留言和谅解,链多了会眼花.  # Title Acceptance Difficulty  617  Merge Two Binary  69.9%  Easy  606  Construct String from Binary Tree  52.0%  Easy  599  Minimum Index Su

LeetCode算法题-Find Mode in Binary Search Tree(Java实现)

这是悦乐书的第246次更新,第259篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第113题(顺位题号是501).给定具有重复项的二叉搜索树(BST),找到给定BST中的所有模式(最常出现的元素).假设BST定义如下: 节点的左子树仅包含键小于或等于节点键的节点. 节点的右子树仅包含键大于或等于节点键的节点. 左右子树也必须是二叉搜索树. 例如: 鉴于BST [1,null,2,2], 1 2 / 2 返回[2]. 注意:如果树有多个模式,您可以按任何顺序返回它们.

LeetCode算法题-Average of Levels in Binary Tree(Java实现)

这是悦乐书的第277次更新,第293篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第145题(顺位题号是637).给定一个非空二叉树,以数组的形式返回每一层节点值之和的平均值.例如: 3 / 9 20 / 15 7 输出:[3,14.5,11] 说明:第一层上的节点的平均值为3,第二层上的节点的平均值为14.5,第三层上的节点的平均值为11.因此返回[3,14.5,11]. 注意:节点值的范围在32位有符号整数的范围内. 本次解题使用的开发工具是eclipse,jd

LeetCode算法题-Lowest Common Ancestor of a Binary Search Tree

这是悦乐书的第197次更新,第203篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第59题(顺位题号是235).给定二叉搜索树(BST),找到BST中两个给定节点的最低共同祖先(LCA).根据维基百科上LCA的定义:"最低共同祖先在两个节点p和q之间定义为T中的最低节点,其中p和q都是后代(我们允许节点成为其自身的后代)." 给定二叉搜索树:root = [6,2,8,0,4,7,9,null,null,3,5] 6 / 2 8 / \ / 0 4 7 9

LeetCode算法题-Diameter of Binary Tree(Java实现)

这是悦乐书的第257次更新,第270篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第124题(顺位题号是543).给定二叉树,您需要计算树的直径长度. 二叉树的直径是树中任意两个节点之间最长路径的长度. 此路径可能会也可能不会通过根节点.例: 给出一棵二叉树 1 / 2 3 / 4 5 返回3,这是路径[4,2,1,3]或[5,2,1,3]的长度. 注意:两个节点之间的路径长度由它们之间的边数表示. 本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,

LeetCode算法题-Count Binary Substrings(Java实现)

这是悦乐书的第293次更新,第311篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第161题(顺位题号是696).给定一个字符串s,计算具有相同数字0和1的非空且连续子串的数量,并且这些子串中的所有0和所有1都是连续的.重复出现的子串也计算在内.例如: 输入:"00110011" 输出:6 说明:有6个子串具有相同数量的连续1和0:"0011","01","1100","10"

LeetCode算法题-Number of 1 Bits(Java实现)

这是悦乐书的第186次更新,第188篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第45题(顺位题号是191).编写一个带无符号整数的函数,并返回它所具有的"1"位数.例如: 输入:11 输出:3 说明:整数11具有二进制表示00000000000000000000000000001011 输入:128 输出:1 说明:整数128具有二进制表示00000000000000000000000010000000 本次解题使用的开发工具是eclipse,jdk使