力扣刷题——day1

1、两数之和

一下就能想到暴力解法,就是一个两个遍历。

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] sum = 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){
                    sum[0]=i;
                    sum[1]=j;
                    return sum;
                }
            }
        }
        return sum;
    }
}

可以改进的点。可以直接返回一个新建的数组。

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

hashmap的解题思想很简单。注意一下hashmap的构建和查找就可以。了解一下hashmap

 

首先了解一下hash:

看了一些hash的浅显讲解,大意就是散列。将一个输入,利用写好的一个函数(hash)函数,对它做变换,得到一个固定长度的输出(key)。

目的:1、可以减少存储空间的占用,输出的大小是固定的。而且尽可能保证各个key出现的概率均匀。不同的输入通过这个H()函数的变换是有可能产生一样的key。尽量编写合适的hash函数来减少这个概率。(抗碰撞能力)

2、加密储存。hash的过程是不可逆的,就算你知道输出值,但是你没有办法得到输入。用于储存密码。而且输入稍微一改动,输出的hash值也会产生很大变化(抗篡改能力)

 

散列表(hash)

key key的存储地址之间(hashcode)的隐射关系。散列函数hash ,hash(key)= addre

冲突:key 不一样,隐射的add是相同的。冲突的解决。

 

hash构造——定义域要包括所有key,hash计算的address要尽可能等概率均匀的分布在地址空间中,尽量简单(减少计算开销)

1、直接定地址法。hash(key)= aKey + b

2、除留余数法。取不大于表长m的最大质数p,hash(key) = key %p

 

 

posted @ 2023-01-09 19:55  晨星shine  阅读(51)  评论(0)    收藏  举报