Datawhale 编程第五期 Day1--数组与链表

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/

这个暂时没来的及做。。待补上

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值