栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

力扣刷题记录二:704、二分查找

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

力扣刷题记录二:704、二分查找

记录力扣刷题第二题

本文中包含C++两种方法的题解以及Java和Python的题解

题目描述如下 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

来源:LeetCode

思路: 看到这题写的是有序的数组,马上就想到了二分查找的算法,但由于昨天写的题运用了哈希表来降低查找操作的时间复杂度,并且运用哈希表写出来的代码也更简单,所以我先试了试哈希表,代码如下。
class Solution {
public:
    int search(vector& nums, int target) {
    	std::unordered_map Hashtb;
    	for(int i = 0; i < nums.size(); ++i) {
    		Hashtb[nums[i]] = i;
    		auto it = Hashtb.find(target);
    		if(it != Hashtb.end()) {
    			return it->second;
    		}
    	}
    	return -1;
    }
};
注意这里要先把数据放入哈希表再进行判断哈,不然数组中只有单个数据时会出错。运用哈希表的时间复杂度为O(n)。不过看执行结果:

执行用时:56 ms, 在所有 C++ 提交中击败了7.99%的用户

还是挺拉的,因此还是用二分查找的方法去写吧。二分查找的时间复杂度为 O ( l o g   2 n ) O(log~{2}n) O(log 2n),即以二为底n的对数,这里不展开证明,引用其他人的证明过程。显然,二分查找的时间复杂度比哈希表的方法低。试着写了写二分查找,也通过了,代码如下。
class Solution {
public:
    int search(vector& nums, int target) {
    	int l = 0, r = nums.size() - 1, mid = 0;
    	while(l <= r) {
    		mid = l + ((r - l)/2);
    		if(nums[mid] > target) {
    			r = mid - 1;
    		}
    		else if(nums[mid] < target) {
    			l = mid + 1;
    		}
    		else {//nums[mid] == target,找到目标了
    			return mid;
    		}
        return -1;
    }
};
要注意的是while里是l<=r,这里假设的是左闭右闭区间才能这么写,假如有一边是开区间,就要改变写法(也包括下面的mid是否加减1)。这里不再赘述,请读者自行思考。
Java和Python的思路与C++一致,代码如下 Java
class Solution {
    public int search(int[] nums, int target) {
    //这里使用左闭右开区间,即[l, r)
        int l = 0, r = nums.length, mid = 0;
        while(l < r) {
        	mid = l + ((r - l)/2);
        	if(nums[mid] > target) {
        		r = mid;//由于是开区间,这里没有减一
        	}
        	else if(nums[mid] < target) {
        		l = mid + 1;
        	}
        	else {
        		return mid;
        	}
        return -1;
    }
}
Python
class Solution:
    def search(self, nums: List[int], target: int) -> int:
    	l, r = 0, len(nums) - 1
    	while l <= r:
    		mid = l + (r - l)//2
    		gt = nums[mid]
    		if gt > target:
    			r = mid - 1
    		elif gt < target:
    			l = mid + 1
    		else:
    			return mid
        return -1
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/894354.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号