第一题 15. 3Sum
算法
自己的
先将整个数组进行排序,然后在数组中找下一个,然后再找最后一个。自己的方法与别人的整个思路大致相似,但是由于没利用数组已经是sort过这个条件,导致复杂度是O(n^3)相当慢
- 重点,当一个Array是排序过的时候,找寻合适的数字的时候可以考虑从双向查找,尾到头同时头到尾。这样时间复杂度会减少很多
12345678910111213141516171819202122232425262728293031public class threeSum15 {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> result = new ArrayList<List<Integer>>();if (nums.length < 3) return result;Arrays.sort(nums);for (int i = 0; i < nums.length - 2; i++) {for (int j = i + 1; j < nums.length - 1; j++) {if (nums[j] > 0 && nums[j] > -nums[i]) break;int target = - nums[i] - nums[j];if (nums[j] > target) break;int position = find(nums, target);if (position > 0 && position != j && position != i) {result.add(Arrays.asList(nums[i], nums[j], nums[position]));}while(nums[j] == nums[j+1] && j < nums.length - 2) j++;}while(nums[i] == nums[i+1] && i < nums.length - 3) i++;if (nums[i] > 0) break;}return result;}public int find(int[] nums, int target) {for (int i = nums.length - 1; i >= 0; i--) {if (nums[i] == target) return i;if (nums[i] < target) break;}return -1;}}
别人的
|
|
学到的东西
- 对一个数组进行排序 Arrays.sort即可
- 对于List
- >可以多个一次性用Arrays.asList进行添加
第二题 16. 3Sum Closest
算法
思路与前一题相似,都是排序之后再通过两个指针的推进,查看是否接近于理想的target值
第三题 259. 3Sum Smaller
算法
自己的O(n^3)
!!!!记住sort之后的一定要考虑是否能用两个指针减少计算的数量级
参考O(n^2)
|
|
第四题 128. Longest Consecutive Sequence
算法
这道题的主要算法是用一个Hashmap将已经出现的数字存下来,key: 对应的是数字,value: 连续的长度。如果是没有出现的,例如n,查看其左边n-1和n+1是否存在。如果存在,获得value即已经有的连续的长度,然后计算出现在新的长度。
比较关键的一步是每次结束的时候,put(n+value_left, value_new),和put(n+value_right, value_new)更新新的边界值.
第五题 162. Find Peak Element
算法
算法一
从后面向前推进,如果是peak就进行输出。复杂度O(n)
算法二
二分查找和回溯,将时间复杂度降为O(n)
利用的原理是:
- If num[i-1] < num[i] > num[i+1], then num[i] is peak
- If num[i-1] < num[i] < num[i+1], then num[i+1…n-1] must contains a peak
- If num[i-1] > num[i] > num[i+1], then num[0…i-1] must contains a peak
- If num[i-1] > num[i] < num[i+1], then both sides have peak
(n is num.length)
|
|