1.数组
题目1 leetcode 15.Three Sum 参见:https://leetcode-cn.com/problems/3sum/comments/
思路:可暴力搜索,三个循环,但时间复杂度是O(n^3),而且不好去重,这里思路是先排序,然后在化为两数之和,且有一些排重加快搜索速度的小技巧,整体复杂度为O(n^2)。
package Day1;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
public class Solution {
public List<List<Integer>> threeSum(int[] nums){
List<List<Integer>> result = new LinkedList<>();
if (nums != null && nums.length > 2) {
Arrays.sort(nums);
for (int i=0; i<nums.length-2;) {
// 另外两个数一个从i后面遍历,一个从最后遍历
int j = i+1;
int k = nums.length-1;
while (j<k) {
// 如果找到解
if (nums[j] + nums[k] == -nums[i]) {
// 加入list
List<Integer> list = new ArrayList<>(3);
list.add(nums[i]);
list.add(nums[j]);
list.add(nums[k]);
result.add(list);
//继续找下一个解
k--;
j++;
//如果下个j相同,择跳过
while (j<k && nums[j]==nums[j-1]) {
j++;
}
//如果下个k相同,择跳过
while (j<k && nums[k]==nums[k+1]) {
k++;
}
}
// 和大于0,说明j,k代表数之和过大,择j不动,k向前
else if (nums[j]+nums[k] > -nums[i]) {
k--;
// 如果碰到相同的数
while (j<k && nums[k] == nums[k+1]) {
k--;
}
}
// 和小于0,j向后
else {
j++;
// 判断下个数是否相同
while (j<k && nums[j]==nums[j-1]) {
j++;
}
}
i++;
while (i<nums.length-2 && nums[i]==nums[i-1]) {
i++;
}
}
}
}
return result;
}
public static void main(String[] args) {
Solution solution = new Solution();
System.out.println(solution.threeSum(new int[]{-1, 0, 1, 2, -1, -4}));
}
}
题目2:leetcode 169.求众数 参见https://leetcode.com/problems/majority-element/
这个很简单,我直接傻瓜式做了:如果数组中有一个数占数组一半,那无论怎么排列,排序后中位数一定是它
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length / 2];
}
但是看到了一个不一样的解法叫摩尔投票法:
public class Solution {
public int majorityElement(int[] num) {
int major=num[0], count = 1;
for(int i=1; i<num.length;i++){
if(count==0){
count++;
major=num[i];
}else if(major==num[i]){
count++;
}else count--;
}
return major;
}
}
2.链表
题目1:leetCode 141.Linked List Cycle 参见https://leetcode.com/problems/linked-list-cycle/
思路:快慢指针,快针走两步,慢针走一步,如果有环,会相遇。
public boolean hasCycle(ListNode head) {
if (head == null) {
return false;
}
ListNode node = head;
ListNode fastNode = head;
while ((node = node.next) != null) {
if (fastNode == null || fastNode.next == null) {
return false;
}
fastNode = fastNode.next.next;
if (node == fastNode) {
return true;
}
}
return false;
}
题目二: leetCode 23.Merge k Sorted List 参考https://leetcode.com/problems/merge-k-sorted-lists/
这个暂时没来的及做。。待补上