100-1 两数之和(简单) (每日一题 Java求解)

题目092f0a51147a45f2afa798fa0839d3b3.png

 方法一:暴力搜索

  1. 外层循环i从nums[0]到nums末尾,内层循环j从nums[i]到末尾(为什么不从nums[0]开始,参见数据结构的冒泡排序,简单来说就是这样会导致重复匹配的问题,浪费时间)
  2. 初做容易产生的错误:
  • 数组没有初始化      --- 对于只知道长度不知道里面具体数值的数组,使用new动态分配 
  • 获取数组长度错误   ----要用nums.length,而不是nums.length()
  • 循环边界找不准  --结合学过的数据结构基础(无基础就多做题总结或者网上学习别人的经验)
  • if条件判断不准  —————————第一遍做题时,我把target和传入的nums数组判断条件写成target和array数组的判断关系,结果提示数组越界,检查之后发现犯了很低级的错误,所以刚开始刷题的同学在不熟练的情况下应该仔细思考一下题目同时回顾学过的知识点,把他们结合起来
  • return缺失  ———————————根据自动生成的JAVA类定义可知返回值是int类型的数组,但是刚做的时候没有注意导致报错,所以同学们写的时候一定要注意这些提示语


    好啦,现在就放出代码啦,记录一下第一天刷题的成果(虽然现在还比较简单)a99cd65dcff84a27a7c1ac35d0c53602.png

     d8a0ceaa5c944bf4bed26c74a0850e6f.png

     



    !!!现在来到更高级的方法二!!

刚刚的暴力算法时间复杂度是O(n^2) 

 but新方法的时间复杂度是O(n)

方法二:哈希表

首先,提一下为什么要使用哈希表,也就是使用这种结构的思路,我们都知道(如果以前不知道,看完这篇文章也就知道了)

HashMap结构是存储不重复的键值对的就是说,我们的target(求和目标)如果减去两数之和的其中一个值,另外一个值一定是不能插入进hashmap的,因此我们利用HashMap的containsKey,只要另一个值无法插入就说明这就是我们的目标值,这时候记录一下他的下标,存进数组返回就可以了

直接放上代码

21584fbf78524e17bcb9dfbe3cc21c3a.png

 已经写的比较通俗易懂了,当然返回值那一块儿也可以直接new一个数组

  • 还要注意的是创建HashMap时里面的数据类型是包装类
  • 另外在循环的地方细心一点保证不越界就基本没问题了

最后放上两个方法的执行用时:

70407ea4ab1f4ebe9130c44f32b28cd0.png

 第一个用时短是方法二哈希表的,用时多的是暴力算法的,由此可见,使用什么数据结构对于我们算法的求解速度还是影响比较大的,因此我们要结合所学知识,尽量使用时间复杂度小的

 

最后的最后,这是一个记录贴,这是贴主刚开始刷算法题的第一天,作为记录督促自己每天写一道。在求解过程中较为生疏也犯了很多低级错误,但我相信日复一日的努力终究会有所收获,当然帖子里的知识也比较基础甚至啰嗦,觉得过于简单请礼貌划走。贴主是科班在校生正在努力学习中,如果有说的不对的地方欢迎读者指正。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值