力扣HOT100解题记录


1. 两数之和

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map map = new HashMap<>();
        for (int i = 0; i < nums.length; i++){
            if (!map.containsKey(target - nums[i])){
                map.put(nums[i], i);
            } else {
                int[] res = {map.get(target - nums[i]), i};
                return res;
            }
        }
        return new int[0];
    }
}

记忆知识点与分析:
暴力法可以解,不过可以用hashmap来用空间换时间,降低计算复杂度

2. 两数相加

我硬写了啥,竟然也能过

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        int sumNum = l1.val + l2.val;
        ListNode start;
        int addNum;
        if (sumNum <= 9){
            start = new ListNode(sumNum);
            addNum = 0;
        } else {
            start = new ListNode(sumNum % 10);
            addNum = 1;
        }
        ListNode point0 = start;
        ListNode point1 = l1;;
        ListNode point2 = l2;

        while (point1.next != null && point2.next != null){
            sumNum = point1.next.val + point2.next.val + addNum;
            if (sumNum <= 9){
                point0.next = new ListNode(sumNum);
                addNum = 0;
            } else {
                point0.next = new ListNode(sumNum % 10);
                addNum = 1; 
            }
            point0 = point0.next;
            point1 = point1.next;
            point2 = point2.next;
        }

        if (point1.next == null && point2.next == null){
            if (addNum != 0){
                point0.next = new ListNode(1);
            }
            return start;
        }

        if (point1.next != null){
            while (point1.next != null && addNum != 0){
                sumNum = addNum + point1.next.val;
                if (sumNum <= 9){
                    point0.next = new ListNode(sumNum);
                    addNum = 0;
                    point1 = point1.next;
                    point0 = point0.next;
                } else {
                    point0.next = new ListNode(sumNum % 10);
                    addNum = 1;
                    point1 = point1.next;
                    point0 = point0.next;
                }
            }
            if (addNum == 0){
                point0.next = point1.next;
                return start;
            } 
            if (point1.next == null){
                point0.next = new ListNode(1);
                return start;
            }
        }

        if (point2.next != null){
            while (point2.next != null && addNum != 0){
                sumNum = addNum + point2.next.val;
                if (sumNum <= 9){
                    point0.next = new ListNode(sumNum);
                    addNum = 0;
                    point2 = point2.next;
                    point0 = point0.next;
                } else {
                    point0.next = new ListNode(sumNum % 10);
                    addNum = 1;
                    point2 = point2.next;
                    point0 = point0.next;
                }
            }
            if (addNum == 0){
                point0.next = point2.next;
                return start;
            } 
            if (point2.next == null){
                point0.next = new ListNode(1);
                return start;
            }
        }
        return start;
    }
}

官方解答看起来流程简单点

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode head = null;
        ListNode point = null;
        int addNum = 0;
        int num1 = l1 == null ? 0 : l1.val;
        int num2 = l2 == null ? 0 : l2.val;
        head = new ListNode((num1 + num2) % 10);
        point = head;
        addNum = (num1 + num2) / 10;
        l1 = l1.next;
        l2 = l2.next;

        while (l1 != null || l2 != null){
            num1 = l1 == null ? 0 : l1.val;
            num2 = l2 == null ? 0 : l2.val;
            point.next = new ListNode((num1 + num2 + addNum) % 10);
            addNum = (num1 + num2 + addNum) / 10;
            point = point.next;
            if (l1 != null){
                l1 = l1.next;
            }
            if (l2 != null){
                l2 = l2.next;
            }
        }
        if (addNum != 0){
            point.next = new ListNode(1);
        }
        return head;
    }
}

记忆知识点与分析:
官方解答里,当有一个链表已经到尾巴的时候,需要做下null的判断,避免空指针

3. 无重复字符的最长子串

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if (s.length() == 0){
            return 0;
        }
        int[] longestSubstring = new int[s.length()];
        char[] charArray = s.toCharArray();
        Map indexMap = new HashMap<>();
        longestSubstring[0] = 1;
        indexMap.put(charArray[0], 0);
        for (int i = 1; i < s.length(); i++){
            if (!indexMap.containsKey(charArray[i])){
                longestSubstring[i] = longestSubstring[i - 1] + 1;
                indexMap.put(charArray[i], i);
                continue;
            }
            if (i - indexMap.get(charArray[i]) > longestSubstring[i - 1]){
                longestSubstring[i] = longestSubstring[i - 1] + 1;
                indexMap.put(charArray[i], i);
            } else {
                longestSubstring[i] = i - indexMap.get(charArray[i]);
                indexMap.put(charArray[i], i);
            }   
        }
        int res = Integer.MIN_VALUE;
        for (int num : longestSubstring){
            res = Math.max(res, num);
        }
        return res;
    }
}

记忆知识点与分析:
题目好像在剑指Offer中做过,想了下就用了动态规划,不过当出现重复字符的判断没有判断正确,需要考虑重复字符之间的距离和上个最大字符串长度。

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        if ((nums1.length + nums2.length) % 2 == 1){
            return findXthNum((nums1.length + nums2.length) / 2 + 1, nums1, nums2);
        } else {
            return (findXthNum((nums1.length + nums2.length) / 2, nums1, nums2) + findXthNum((nums1.length + nums2.length) / 2 + 1, nums1, nums2)) / 2;
        }
    }
    public double findXthNum(int k, int[] nums1, int[] nums2){
        int length1 = nums1.length;
        int length2 = nums2.length;
        int index1 = 0;
        int index2 = 0;
        
        while (true){
            if (index1 == length1){
                return nums2[index2 + k - 1];
            }
            if (index2 == length2){
                return nums1[index1 + k - 1];
            }
            if (k == 1){
                return Math.min(nums1[index1], nums2[index2]);
            }

            int half = k / 2;
            if (nums1[Math.min(index1 + half, length1) - 1] <= nums2[Math.min(index2 + half, length2) - 1]){
                k = k - (Math.min(index1 + half, length1) - index1);
                index1 = Math.min(index1 + half, length1);
                continue;
            }
            if (nums1[Math.min(index1 + half, length1) - 1] > nums2[Math.min(index2 + half, length2) - 1]){
                k = k - (Math.min(index2 + half, length2) - index2);
                index2 = Math.min(index2 + half, length2);
                continue;
            }
        }
    }
}