Leetcode(两数之和,链表合并,移动零,盛水问题)|刷题打卡

243 阅读2分钟

1.两数之和 LeetCode 1题


题解:暴力方法双层循环相加等于目标值,本例子用了HashMap把当前nums[i]当做key把index下标当做value存到map中去,在存的过程中判断目标值减去当前循环的值,是否已经在map中存在,如果存在那么就是map中的这个值加上当前循环的值等于目标值target,满足题意返回两个下标,map存的下标需要map.get(key),key就等于target - nums[i]目标值减去当前循环的值,当前的下标就是i,返回即可。理解并能想到用HashMap这种方法,HashMap在很多题解中超好用。

  public static int[] twoSum(int[] nums, int target) {
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        if (map.containsKey(target - nums[i])) {

            return new int[]{map.get(target - nums[i]), i};

        }
        map.put(nums[i], i);

    }
    return nums;

2.合并两个有序链表LeetCode 21题

题解:每次递归进来比较l1和l2两个链表当前值的大小,下一个结点永远连接比较小的值,结束条件是l1和l2有一个为null,这题需要理解并能默写出来。

public ListNode mergeTwoLists1List(ListNode l1, ListNode l2) {
    if(l1==null){
        return l2;

    }
    if(l2==null){
        return l1;
    }
    if(l1.val<l2.val){
        l1.next=mergeTwoLists1List(l1.next,l2);
        return l1;
    }else{
        l2.next=mergeTwoLists1List(l1,l2.next);
        return l2;
    }
}

3.盛水最多的容器 LeetCode 11题

题解:循环从两头往中间走,i++和j--到底是该i++还是j--比较好理解的是,如果a[i]和 a[j]值做比较,因为题解是需要装最多,所有肯定移动a[i]和a[j]比较小的值往中间走,因为我也不确定往中间走会不会遇到比当前值大的所以需要每次用max记录最大的值就是最多的水,当找到最中间,max就是最大值直接返回。需要很熟悉的写出来。

public static int maxArea(int a[]) {
    int max = 0;
    for (int i = 0, j = a.length - 1; i < j; ) {
        int moveMinBar = a[i] < a[j] ? a[i++] : a[j--];
        max = Math.max(max, (j - i + 1) * moveMinBar);

    }
    return max;
}

4.移动零 LeetCode 283题

题解:第一遍循环先把nums[i]值不是0的装到一个集合里面,题目要求需要在原数组上操作,因为原数组最坏的可能是一个0都没有,所以完全满足题意,把不等于0的值按秩序依次放到nums[j]中,放完j++,也可以写成nums[j++]。第一遍循环完,原数组的长度减去重新放值的长度i-j就是有多少个0,再从j到i循环在最后面补充0。需要第一遍知道这种解法下次要能独立写出来。

public static void moveZeroes(int[] nums) {
    //第一遍只要是非0的统统都赋给nums[j]
    int j=0;
    for (int num : nums) {
        if(num!=0){
            nums[j]=num;
            j++;
        }
    }
    //替换后面的末尾的元素都赋为0即可从i-j是多少就需要在结尾补充多少个0
    for(int i=j;i<nums.length;i++){
        nums[i]=0;
    }
}