题目![092f0a51147a45f2afa798fa0839d3b3.png](https://i-blog.csdnimg.cn/blog_migrate/f597c7559452b4f160743dfb5903c0fb.png)
方法一:暴力搜索
- 外层循环i从nums[0]到nums末尾,内层循环j从nums[i]到末尾(为什么不从nums[0]开始,参见数据结构的冒泡排序,简单来说就是这样会导致重复匹配的问题,浪费时间)
- 初做容易产生的错误:
- 数组没有初始化 --- 对于只知道长度不知道里面具体数值的数组,使用new动态分配
- 获取数组长度错误 ----要用nums.length,而不是nums.length()
- 循环边界找不准 --结合学过的数据结构基础(无基础就多做题总结或者网上学习别人的经验)
- if条件判断不准 —————————第一遍做题时,我把target和传入的nums数组判断条件写成target和array数组的判断关系,结果提示数组越界,检查之后发现犯了很低级的错误,所以刚开始刷题的同学在不熟练的情况下应该仔细思考一下题目同时回顾学过的知识点,把他们结合起来
- return缺失 ———————————根据自动生成的JAVA类定义可知返回值是int类型的数组,但是刚做的时候没有注意导致报错,所以同学们写的时候一定要注意这些提示语
好啦,现在就放出代码啦,记录一下第一天刷题的成果(虽然现在还比较简单)
!!!现在来到更高级的方法二!!
刚刚的暴力算法时间复杂度是O(n^2)
but新方法的时间复杂度是O(n)
方法二:哈希表
首先,提一下为什么要使用哈希表,也就是使用这种结构的思路,我们都知道(如果以前不知道,看完这篇文章也就知道了)
HashMap结构是存储不重复的键值对的就是说,我们的target(求和目标)如果减去两数之和的其中一个值,另外一个值一定是不能插入进hashmap的,因此我们利用HashMap的containsKey,只要另一个值无法插入就说明这就是我们的目标值,这时候记录一下他的下标,存进数组返回就可以了
直接放上代码
已经写的比较通俗易懂了,当然返回值那一块儿也可以直接new一个数组
- 还要注意的是创建HashMap时里面的数据类型是包装类
- 另外在循环的地方细心一点保证不越界就基本没问题了
最后放上两个方法的执行用时:
第一个用时短是方法二哈希表的,用时多的是暴力算法的,由此可见,使用什么数据结构对于我们算法的求解速度还是影响比较大的,因此我们要结合所学知识,尽量使用时间复杂度小的
最后的最后,这是一个记录贴,这是贴主刚开始刷算法题的第一天,作为记录督促自己每天写一道。在求解过程中较为生疏也犯了很多低级错误,但我相信日复一日的努力终究会有所收获,当然帖子里的知识也比较基础甚至啰嗦,觉得过于简单请礼貌划走。贴主是科班在校生正在努力学习中,如果有说的不对的地方欢迎读者指正。