Leetcode单排上分日记

在这里记录我刷题时候的思路,因为leetcode的编辑器就算是会员也不存档,

解答中也没有注释,长此以往做一道忘一道,所以在这里记录下

1. 两数之和(简单)

(java)

class Solution {
    public int[] twoSum(int[] nums, int target) {
        //定义这个数组是为了将nums中的第i个元素nums[i]的值nums[i]和位置i记录下来
        // 因为map的key是不重复的,所以在这里把nums[i]作为key存入
        // 这样再通过map.containsKey去查就是O(1)时间复杂度
        // 而且这些算法题很讲究两件事情同时做
        HashMap<Integer, Integer> map= new HashMap<Integer, Integer>();
        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 new int[0];
    }
}

 

2.两数相加(中等)

(java)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //读完题,不慌不慌,先设置两个元素存头节点和尾节点
        ListNode head = null, end = null;
        //进位,实际上不能超过1,因为两个个位数相加不会超过20
        int carry = 0;
        // 如何循环链表,这就是示范
        while(l1 != null || l2 != null){
            //非空则取值
            int n1 = l1 != null ? l1.val : 0;
            int n2 = l2 != null ? l2.val : 0;
            int sum = n1 + n2 + carry;
            //接下来就是扩展链表的方法了
            if(head == null){
                head = end = new ListNode(sum%10);
            }else{
                //在end之后插入一个节点,此时end不是尾节点了
                end.next = new ListNode(sum%10);
                //将end节点向后移动,使end真正成为尾节点
                end = end.next;
            }
            carry = sum/10;
            //类似于for循环中i++的机制,这里是改变指针的位置,l1,l2都向尾节点移动一位
            if(l1 != null){
                l1 = l1.next;
            }
            if(l2 != null){
                l2 = l2.next;
            }
        }
        if(carry > 0){
            end.next = new ListNode(carry);
        }
        //返回链表,从head节点(头节点)穿到end节点(尾节点)
        return head;
    }
}

3.无重复字符的最长字串(中等)

(java)(滑动窗口法)(滑动窗口还需研究)

class Solution {
    public int lengthOfLongestSubstring(String s) {
        // 哈希集合,记录每个字符是否出现过
        Set<Character> set = new HashSet<Character>();
        int n = s.length();
        // 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
        int rightIndex = -1, ans = 0;
        // 逐个字符循环字符串s
        for(int i = 0;i < n; ++i){
            if(i != 0){
                // 左指针向右移动一格,移除一个字符
                set.remove(s.charAt(i-1));
            }
            while(rightIndex + 1 < n && !set.contains(s.charAt(rightIndex + 1))){
                // 不断地移动右指针
                set.add(s.charAt(rightIndex + 1));
                ++rightIndex;
            }
            // 第 i 到 rk 个字符是一个极长的无重复字符子串
            ans = Math.max(ans, rightIndex - i + 1);
        }
        return ans;
    }
}

 

(java)(另一种时间复杂度更低的方法)

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if(s.length() <= 1){
            return s.length();
        }

        int low = 0,max = 1;
        char m[] = s.toCharArray();
        for(int i = 1; i < m.length; i++){
            for(int j = low; j < i; j++){
                if(m[i] == m[j])
                {
                    low = j + 1;
                    break;
                }
            }
            max = max > (i-low+1)? max : (i-low+1);
        }
        return max;
    }
}

 

 

 

4.寻找两个正序数组的中位数(困难)

(java)好难,先放着

 

5.最长回文子串(中等)

(java)

 

posted @ 2022-05-26 07:37  佩洛君  阅读(22)  评论(0编辑  收藏  举报