leetcode

1.Two Sum


 解题思路明显是用target-nums[i]判断给定数组中是否存在,问题是如何快速找到,不然就成了n2问题了。一种思路是hashmap,另一种是大数组,后者问题出在了如果存在负数情况如何考虑(提交速度快的答案只是投机取巧测试用例最小用到了-4)。如果我用另外一个数组专门存负数的,反而慢了很多和n2快接近了,因为每一次循环要作的判断太多。

本题还是典型的空间换时间问题。

 

15. 3Sum


 解题思路,一开始没有考虑那么深刻,先进行排序,然后循环每一个数,从它后面根据two sum的规律进行查找即可。但是问题的关键在于重复数组,如果在n2时间复杂度下再进行contains查询肯定时间太长,然后陷入了[0,0,0,0]和[-1,-1,0,1,2]的测试用例中,因为如果外层循环直接排除重复,那么有可能是-1-1这种情况被排除,还有一个问题没考虑到是[-2,0,1,1,2],需要two sum进行再搜索。仔细想想,问题关键在于重复,一开始的两个用例归结就是内层循环的重复问题,其实解决内层循环就可以了。 while(start!=end&&nums[start]==nums[start-1])start++; start和end分别是内层循环的起始末尾的判断。

本题思路情况影响较多,需要抽离出公共点,将情况缩减就可以得出清晰的思路。

 

167. Two Sum II - Input array is sorted


 解题思路要考虑到排序,所以我们要想到如何利用,假如我们存在某组数据不合适,这时候由于是排序的,如果大于指定的target,那么我们可以将选择到的排在靠后的数据替换成它的前一个,小于同理。

 

2. Add Two Numbers


 解题思路还是比较简单的,只是要注意向高位进位。

比较优的解法借鉴思路是将所有可能的情况放入while中,用或运算进行判断,进而少掉了很多冗余的写法。while(l1 || l2 || carry);

 

 Reverse Words in a String


题目要求反转句子中所有word的位置。思路整个句子反转然后每个word中的字母,但是在写清除前后空格和连续空格的时候卡壳很久。

这个是我总是陷入的思路

for ( int i=0; i<len ; i++) {
    if ( c[i] != ' ' ) {
        for ( ; i<len && c[i] != ' ' ; i++) {
             c[start++] = c[i];
        }
    }
}

这个是比较好的清晰思路

// trim leading, trailing and multiple spaces
  String cleanSpaces(char[] a, int n) {
    int i = 0, j = 0;
      
    while (j < n) {
      while (j < n && a[j] == ' ') j++;             // skip spaces
      while (j < n && a[j] != ' ') a[i++] = a[j++]; // keep non spaces
      while (j < n && a[j] == ' ') j++;             // skip spaces
      if (j < n) a[i++] = ' ';                      // keep only one space
    }
  
    return new String(a).substring(0, i);
  }

总结:条件嵌套太多层,不如外层一个循环但不判断条件,然后内部按逻辑判断条件,不会造成外层的判断其实有两种以上情况

 

posted @ 2018-05-01 22:51  Grim_Reaper  阅读(136)  评论(0编辑  收藏  举报