【leetcode】1.两数之和

个人解法

暴力法

从前向后,看是否能找到 target-num[i]

时间复杂度 O ( n 2 ) O(n^2) O(n2)
空间 O ( 1 ) O(1) O(1)

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] ans = new int[2];

        for(int i = 0;i < nums.length;++i){
            for(int j = i+1;j < nums.length;++j){
                if(nums[i]+nums[j]==target){
                    ans[0] = i;
                    ans[1] = j;
                }
            }
        }

        return ans;
    }
}

在这里插入图片描述
竟然能过,有点吃惊,感觉该有哈希或者其他做法吧。再想想


题解

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>();
        for (int i = 0; i < nums.length; ++i) {
            if (hashtable.containsKey(target - nums[i])) {
                return new int[]{hashtable.get(target - nums[i]), i};
            }
            hashtable.put(nums[i], i);
        }
        return new int[0];
    }
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这道题重点在于找到当前元素的补数。

  • 暴力法是遍历找,查找过程 O ( N ) O(N) O(N)
  • 而把数据放到哈希表中,根据数据内容确定存储位置,当知道数据内容就能知道存储位置,所以可以以 O ( 1 ) O(1) O(1) 时间复杂度找到该元素。

问题

先留着,以后系统学了集合框架解决

  • HashMap查找过程
  • HashMap 建立过程

哈希表什么时候都是 O ( 1 ) O(1) O(1) 找到目标数据吗?

在这里插入图片描述
正常情况 O ( 1 ) O(1) O(1) 就能从哈希表中取到数据,有冲突会扫链表,这时不是 O ( 1 ) O(1) O(1) 取到数据

哈希冲突解决方法

开放定址法

H i = ( H ( k e y ) + d i ) % m H_i=(H(key)+d_i)\%m Hi=(H(key)+di)%m

  1. 线性探测法

    d i = 1 , 2 , . . . , k ( k ≤ m − 1 ) d_i=1,2,...,k(k \le m-1) di=1,2,...,k(km1)

    造成同义词 聚集 在相邻的散列地址,大大降低查找效率

  2. 平方探测法

    d i = 0 2 , 1 2 , − 1 2 , 2 2 , − 2 2 , . . . , k 2 , − k 2 ( k ≤ m 2 ) d_i=0^2,1^2,-1^2,2^2,-2^2,...,k^2,-k^2(k\le \frac{m}{2}) di=02,12,12,22,22,...,k2,k2(k2m)

    m必须是一个可以表示为 4k+3 的素数

    • 避免出现 堆积问题
    • 不能探测散列表所有单元,但至少探测一半
  3. 再散列法

    H i = ( H ( k e y ) + i ∗ H a s h 2 ( k e y ) ) % m H_i = (H(key)+i*Hash_2(key))\%m Hi=(H(key)+iHash2(key))%m

    初始探测位置H_0=H(key)%m ,i是冲突次数,初始为0
    最多经历 m-1 次探测就会遍历表中所有位置,回到 H_0

  4. 伪随机数法
    d i = 伪随机数序列 d_i=伪随机数序列 di=伪随机数序列

拉链法

同义词以链表形式链接到同一单元后
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AmosTian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值