LeetCode-1-两数之和(JAVA-暴力枚举+哈希表)

​​​​​题目描述

解题思路-暴力枚举(最容易想到)

对整数数组nums[]遍历两次,找到nums[i]+nums[j]==target的i和j,返回i和j.

源码提交

  • 时间复杂度:O(N*N)
  • 空间复杂度:O(1)
  • 提交记录

  • 源码
class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] arry = new int[2];//可以直接去掉这种初始化数组,直接在return的那里newy一个int[]
        for(int i=0;i<nums.length-1;i++){
            for(int j=i+1;j<nums.length;j++){
                if(target==(nums[i]+nums[j])){
                    arry[0]=i;
                    arry[1]=j;
                    break;
                }
            }
        }
        return arry;
    }
}

参照LeetCode官方题解

方法一 暴力枚举

  • 时间复杂度:O(N*N)
  • 空间复杂度:O(1)
  • 提交记录

  • 源码
class Solution {
    public int[] twoSum(int[] nums, int target) {
        //method 1 暴力枚举
        //时间复杂度:O(N*N);空间复杂度:O(1)
        for(int i=0;i<nums.length-1;++i)
            for(int j=i+1;j<nums.length;++j)
                if(target==(nums[i]+nums[j]))
                    return new int[]{i,j};
        return new int[0];
    } 
}

方法二 哈希表

  • 时间复杂度:O(N)
  • 空间复杂度:O(N)
  • 提交记录

  • 源码
class Solution {
    public int[] twoSum(int[] nums, int target) {
  
        //method 2 哈希表
        //时间复杂度:O(N);空间复杂度:O(N)。(用空间换时间)
         Map<Integer,Integer>map = new HashMap<Integer, Integer>();
         for(int i = 0; i<nums.length;++i){
             if(map.containsKey(target-nums[i]))
                 return new int[]{map.get(target - nums[i]), i}; 
             map.put(nums[i],i);
        }
        return new int[0];//int[2]=[0,0],默认初始值为0
    }

}

注意:这里是把数组nums的值作为map的key,把下标作为value(一开始我写成map.put(i,nums[i],想要用containsValue()函数判断取对应的key,发现代码的时间复杂度会更多,也有可能我写得不对);目的是为了做判断,当map.containsKey(target-nums[i])时,取此时map的key对应的value。

学习笔记

  • 数组初始化

//数组初始化方式
int[] arry = new int[2];//初始化数组值为0,即{0,0}
int[] arry = new int[]{1,2,3}
int[] arry = {1,1};
  • 数组的长度

int len = arry.length;//正确
int len = arry.length();//错误
int len = arry.size();//错误
  • 哈希表使用

  • Map是一个接口;HashMap是对该接口的重要实现。(就跟List是接口,ArrayList是对该接口的实现)

  • HashMap的containsKey(11)方法用来判断哈希表里的key是否有这个11,返回值为true or false。同样也有containsValue()方法。

  • for循环中使用++i来代替i++.虽然循环中执行效果一样,但是++i不会产生一个临时变量(i++会产生一个临时变量),直接+1,性能更好。并且++i可以作为左值使用(我在leetcode上java环境测试以下代码提示有bug???)

    int i = 0;
    ++i = 1; //正确
    i++ = 5; //错误

(如有错误,欢迎批评指正!)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值