算法题库 java实现_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

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

temp[nums[i]+10000] = i+1;

}

return temp[target+10000] == 0 ? -1 : temp[target+10000]-1;

}

05 小结

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书的目标读者是准备去硅谷找工作的码农,也适用于在国内找工作的码农,以及刚接触ACM算法竞赛的新手。 市场上讲解算法的书已经汗牛充栋,为什么还要写这本书呢?主要原因是我对目前市场上的大部分算法书都不太满意。 本书有如下特色: 背后有强大的AlgoHub支持。 本书的所有目,都可以在 www.algohub.org(即将上线) 上在线判断代码。这样的一大好处是,读者可以边看书,边实现自己的代码,然后提交到网站上验证自己的想法是否正确。AlgoHub的使命是成为最好的算法学习和交流平台。AlgoHub囊括了 POJ, ZOJ, leetcode, HackerRank 等网站的经典目(一些质量不高的目则忽略),且 AlgoHub有非常简单的加系统,用户不需要写一行代码即可自己添加目,所以AlgoHub的题库还在飞速增长中。 每道都有完整的代码。 市场上的大部分书,都会讲思路,但给出的代码都是片段,不是完整可编译的代码。本书每都有完整的代码,且每个代码经过千锤百炼,保证可读性的前提下尽可能简短,方面读者在面试中能快速写出来。 每道都有多种解法。 本书的宗旨是,用尽可能少的目,覆盖尽可能多的算法。本书中的的每道都有多种解法,每种解法不是简单的小改进,而是完全不同的思路,力求举一反三,让读者触类旁通。 本书支持多种主流编程语言。 目前支持 Java, C++, C#, Python, Ruby, JavaScript, Swift, Scala, Clojure, 将来还会支持更多编程语言。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值