查找算法总结

查找算法

顺序查找

  • 算法描述
    在查找中顺序遍历链表中的值,判断是否与所查找目标是否相等。

  • 复杂度分析

  • 常见可用题型
    1.剑指 Offer 53 - II. 0~n-1中缺失的数字

     一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。
     在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
    
     限制:1 <= 数组长度 <= 10000
     	
     来源:力扣(LeetCode)
     链接:https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof
    

    思路:数组长度是n-1,而数组里面的值范围又是0~n-1,且数字递增且唯一,那么数组里的正常值应该与数组下标。要找出一个不在数组里面的数字,就只需遍历一次,找出值与下标不相同的数组元素的下标。时间复杂度:

    复杂度
    时间复杂度:O(N)
    空间复杂度:O(1)

    实现

class Solution {
    public int missingNumber(int[] nums) {
        int len = nums.length;
        for (int i=0; i<=len; i++){
            if (i == len && nums[len-1] != i) return i;
            if (nums[i] != i) return i;
        }
        return 0;
    }
}

2.剑指 Offer 11. 旋转数组的最小数字

	把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
	给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。
	请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为1。
	
	来源:力扣(LeetCode)
	链接:https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof
	著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路: 升序排列的数组旋转后,最小值应出现在被旋转的元素中,除了全部元素出现了重复的情况。那么最小值就是比前一个数组元素小的元素。

复杂度:
时间复杂度:O(N)
空间复杂度:O(1)
实现:

class Solution {
    public int minArray(int[] numbers) {
        int prim = 0;
        if (numbers.length > 0) prim = numbers[0];
        for (int i = numbers.length -1; i >=0; i--){
            if (numbers[i] < numbers[Math.max(i - 1, 0)]) return numbers[i];
        }

        return prim;

    }
}

二分查找

引入:同学A问同学B, 你这个杯子多少钱?
A:你猜?
B: 20?
A: 不对,少了。
B: 35?
A: 多了
B: 25
A:多了
B: 23
A:对了
像这样通过猜一个值,并能够判断这个值与目标值的大小,我们就可以缩小范围,最后找到目标值。 当一个数组是有序的,我们每次都去猜数组中间的那个值是我们要查找的目标,设中间下标为mid。如果不是,就去比较这个中间值与目标值的大小,如果比目标值大,则目标值在[0, mid-1]之间,如果比目标值小,则目标值在 [mid+1, n-1] 之间,n为数组大小。像这样一次次的猜中间的值,进行二分,缩小范围,到最后一定能找到我们想要的目标值。

算法描述: 将目标值和中间键比较,如果相等则返回其索引;如果小于中间键则在左半部分查找;大于则在右半部分查找。

复杂度分析:
时间复杂度:O(logn)
假设有n个元素,每次查找的区间大小就是n,n/2,n/2^2,… ,n/2^k,k为划分区间的次数,最坏情况下区间大小为1,即 n/2^k=1,那么k=log(2, n),以2为底的对数。所以时间复杂度为 O(logn)

实现:
递归实现:
迭代实现:

二叉查找树

平衡二叉查找树

散列表

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值