Leetcode 20161007-1014

来源:互联网 发布:心经 张爱玲 知乎 编辑:程序博客网 时间:2024/05/17 00:01

Leetcode训练

Two Sum

题目链接
给出一个数组,一个目标值。在数组中找出两个数相加等于目标值,给出在数组中的位置。

思路

  1. 把数组nums排好
  2. i=0,j=len(nums)-1是一头一尾,将相加sum=nums[i]+nums[j]与目标值进行比对,小则i+=1,大则j-=1。直至找出两个数
  3. 遍历原数组,找出下标

错误点

  1. 没有考虑[0,1,2,0],0这种情况,遍历原数组时,需要进行从头,从尾分别做一次匹配,以避免两次找到同一个数。

改进

通过使用哈希可以巧妙解决

  1. 一个字典为空dict = {}
  2. 遍历数组for i in range(0,len(nums)-1)
  3. 看target - i 值在不在字典中,如果在,即可成功获得两个数字及下标
  4. 如果不在,将{nums[i]:i}放入字典中,dict[nums[i]]=i,
  5. 重复3,4步

当第一个数字进入了字典后,运行到第二个数字,即可获得结果

Integer To Roman

思路

题目链接
使用这两个数组

values = [ 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 ]romans = [ "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" ]

num为输入的Integer,如果num不为0,遍历values,直到num>=values[i]
str添加这个罗马数字,并将num-=values[i]。直到num<=0(不会出现<0)。
含有4,9数字是一个例外,因为需要在前面添加I。所以我们在这里额外添加了900,400,90,40,9,4这几个字母,以规避需要在10,5的情况前添加罗马字母的问题。

Maximum Subarray

题目链接,终于来到这周难点的题目了。因为想做dp的,所以就选了这题。
不过其实这题也是比较容易的。

例如:某个数组[-2,1,-3,4,-1,2,1,-5,4]
sum[n]表示到由以第n个数结束的子数组最大和。如sum[n]=a[1]=-2,sum[2]=a[2],因为sum[n]<0的时候证明sum[n-1]对于sum[n]是没有帮助的,所以应该舍弃掉。因此,当判断sum[n]=a[n]或sum[n]=sum[n-1]+a[n]。取决于sum[n-1]是否大于0。
错误点:
一开始将sum,maxSum的初始值设为0,这样导致一些问题。因为[-1]这样的话也是要-1,所以应该sum = a[0] maxSum = a[0]。

总结

这周感觉题目还是比较水的,自己也没什么实力,就先用这些慢慢水一下先。

0 0