LeetCode1000题:我的第一题

一、一个开始
昨天得知了LeetCode这个平台,于是就在今天下课之后,在官网上注册了账号并开始了第一题。因为也是才学了点java基础,第一题做的时间就有点长。我想能够通过刷编程题目提升下自己的编码能力。希望我能坚持刷完题目,并且在此之后能够有比较大的提升。加油吧!
二、题目描述
第一题比较第一题的题目大致是这样的:
给定一个整数数组nums和一个目标数字target。在该数组中查找两个值,这两个值相加的和要等于目标数字。然后返回这两个数字的下标值。
比如:给定的数组nums:[1,2,3,4].给定的目标数字target:7.从题目来看,3+4=7,所以返回他们的下标应该是[2,3]。
解题思路和方法:
1.我一开始的想法是,直接遍历一遍,寻找匹配条件的两个数字。虽然时间可能会比较慢,但是能够做出来。于是,我的思路如下:从第一位元素开始,遍历数组,用i来表示;接着从末尾端开始,倒着遍历数组,用j来表示。这样,可以来做两两比较。接着用if语句来判断。符合条件的i和j就将他们传递进index并return。
于是,我的第一题答案:

class Solution {  
  public int[] twoSum(int[] nums, int target) {  
           int[] index = new int[0]; 
    for (int i = 0; i < nums.length; i++) {       //从0位开始遍历
     for (int j = nums.length - 1; j > 0; j--) {        //从末端开始遍历
             if (nums[i] == target - nums[j]) { 
                  index = new int[]{i, j};   //符合条件的下标传递进index      
                } 
            }   
    }
  return index;  
    }
 }

这里我忽略了一个地方,所以第一次我的测试结果报错了。我没有注意到“你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。”这么一句话。所以在测试用例中,有nums=[3,3],target=6这个例子我没有通过。我的答案是[1,1],而标准答案是[0,1]。显然,我的答案是错误的。于是我又在if语句中加入了&&!i=j.这样,再次去测试的时候,我的结果通过了。不足的是,测试的时间比较长,执行了78ms。仅仅打败了6.48%的用户…
修改后的正确代码如下:

class Solution {  
  public int[] twoSum(int[] nums, int target) {  
           int[] index = new int[0]; 
        for (int i = 0; i < nums.length; i++) {       //从0位开始遍历
         for (int j = nums.length - 1; j > 0; j--) {        //从末端开始遍历
             if (nums[i] == target - nums[j]) { 
                  index = new int[]{i, j};   //符合条件的下标传递进index      
                } 
            }   
    }
  return index;  
    }
 }

以上就是我的第一题第一种解题方法。
看了评论区,发现比较好的解决方法是哈希表。于是参观了别人的代码。
2.一遍哈希表的方法,我是看了官方的题解。粗略的懂了一些,不过有点细节需要去细细研究。这个查找方法特别快,只用了3ms。相比于我的第一种方法,快了75ms…

public int[] twoSum(int[] nums, int target) {
    Map<Integer, Integer> map = new HashMap<>();
    //遍历一遍nums,i+j=target.
    for (int i = 0; i < nums.length; i++) {
        int j = target - nums[i];
        //containsKey,查找含有j的键,有则表明存在j,与i相加等于target
        if (map.containsKey(j)) {
            return new int[]{map.get(j), i};
        }
        map.put(nums[i], i);
    }
    throw new IllegalArgumentException("No two sum solution");

}

3.第三种方法是两遍哈希表的解法。

// 第三种方法:两遍哈希表
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        //首先遍历一遍,将nums的每个值添加到map中
        for (int i = 0; i < nums.length; i++) {
            map.put(nums[i], i);
        }
        for (int i = 0; i < nums.length; i++) {
            int j = target - nums[i];//这里是和第二种方法一样的判断
            if (map.containsKey(j) && map.get(j) != i) {
                return new int[]{map.get(j), i};
            }
        }


        throw new IllegalArgumentException("No two sum solution");
    }

、总结自己的问题
1.基础掌握的不是很好,模模糊糊的概念,不太清晰的逻辑,不规范的代码,这些都需要练习
2.Array类和arraylist类之间老是搞混淆。
3.抛出异常的概念不知道,retern语句的概念居然很混淆…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值