【LeetCode】TwoSum、AddTwoNumbers
LeetCode小记
好久没写过题目了,思维都僵化了←_←,所以先找点简单些的题目找找感觉。
因为现在基本不会用到C/C++,所以使用Java来做。
TwoSum
系列题目
题意 > 求数组内相加为目标值的两个数的下标
1
Two Sum
这题要做出来很简单,但是想优化一下时间复杂度就要思考思考了。第一反应只想到了用Map
来存数和下标的键值对,考虑是不是排个序再取个目标值的一半,然后向两边加。但是这样实际上做了层排序,耗费了时间,如果有多个目标值而数组一致的话,可以考虑。当然这里就不是了。
正解:使用Map
,来逐个存储数组的数,并在存储前检查Map
内是否包含a
与将要存储的数b
,满足b + a = target
,满足则返回a
的下标和当前数的下标,否则存储b
及下标,然后继续下一个数。
小结:这样省去了查找下标、查到结果以外的无用计算等等。
167
Two Sum II —— Input array is sorted
刚好就看到有这题,之前从里往外的算法,实现比较不简洁,看到题解什么的都是从外往里算的,当然这样比较好用while
来写。
2
Add Two Numbers
题意 > 两个正整数,用单向链表来倒叙表示,链表的每个节点代表数的一位,求相加后的数对应链表。
要点:相加进位,进位的值要加到下一个节点,最高位进位,两个数不同长度的补位
坑:1 + 9,9,9 = 0,0,0,1
,这里多次进位
方法:我一开始用的递归实现,因为更好想一点吧(以前一定直接非递归的Orz),每个节点考虑,计算相加的结果,然后填入new
的节点t
,t
的next
递归调用传入两个节点对应的next
,中间加上判空以及溢出计算就好了。
非递归也没有那么麻烦,只是用while
来实现子节点的计算。