刷题日记

323 阅读1分钟

算法思维

  • 基础技巧:分治、二分、贪心
  • 排序算法:快速排序、归并排序、计数排序
  • 搜索算法:回溯、递归、深度优先遍历,广度优先遍历,二叉搜索树等
  • 图论:最短路径、最小生成树
  • 动态规划:背包问题、最长子序列

动态规划

股票问题

背包问题

回溯

贪心

45. 跳跃游戏 II
class Solution {
    public int jump(int[] nums) {
        int length = nums.length;
        int end = 0;
        int maxPosition = 0; 
        int steps = 0;
        for (int i = 0; i < length - 1; i++) {
            maxPosition = Math.max(maxPosition, i + nums[i]); 
            if (i == end) {
                end = maxPosition;
                steps++;
            }
        }
        return steps;
    }
}

数据结构

  • 数组与链表:单 / 双向链表
  • 栈与队列
  • 哈希表
  • 堆:最大堆 / 最小堆
  • 树与图:最近公共祖先、并查集
  • 字符串:前缀树(字典树) / 后缀树

链表

21. 合并两个有序链表
        public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
            if(l1==null) return l2;
            if(l2==null) return l1;
            if(l1.val<l2.val){
                l1.next=mergeTwoLists(l1.next,l2);
                return l1;
            }else{
                l2.next=mergeTwoLists(l1, l2.next);
                return l2;
            }
        }

普通栈

速记内容还原
    private String UnzipString(String records){
        String result="";

        LinkedList<StringBuilder> stack_res=new LinkedList<>();
        int cur_multi=0;
        StringBuilder cur=new StringBuilder();
        stack_res.push(cur);
        for(char record:records.toCharArray()){
            if(Character.isAlphabetic(record)) {
                stack_res.peek().append(record);
            }
            if(record=='('){
                cur=new StringBuilder();
                stack_res.push(cur);
            }
            if(record==')'){
                continue;
            }
            if(Character.isDigit(record)){
                cur_multi=cur_multi*10+record-'0';
            }
            if(record=='<'){
                cur_multi=0;
            }
            if(record=='>'){
                StringBuilder temp=stack_res.pop();
                for(int i=0;i<cur_multi;i++){
                    stack_res.peek().append(temp);
                }
            }
        }
        return stack_res.peek().toString();
    }

1190. 反转每对括号间的子串
class Solution {
    public String reverseParentheses(String s) {

        LinkedList<StringBuilder> res_stack=new LinkedList<>();
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<s.length();i++){
            if(Character.isAlphabetic(s.charAt(i))){
                sb.append(s.charAt(i));
                continue;
            }
            if(s.charAt(i)=='('){
                res_stack.push(sb);
                sb=new StringBuilder();
                continue;
            }
            if(s.charAt(i)==')'){
                StringBuilder temp=res_stack.pop();
                sb=temp.append(sb.reverse());
            }
        }
        return sb.toString();
    }
}

单调栈

739. 每日温度
class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        LinkedList<Integer> stack=new LinkedList<>();
        int[] result=new int[temperatures.length];
        for (int i=0;i< temperatures.length;i++){
            while((!stack.isEmpty())&&(temperatures[i]>temperatures[stack.peek()])){
                int index=stack.pop();
                result[index]=i-index;
            }
            stack.push(i);
        }
        return result;
    }
}

哈希表

任务规划
    public int divideGroup(int[] tasks, int[][] mutexPairs) {

        int result=1;

        Map<Integer,Set<Integer>> map=new HashMap<>();
        Arrays.stream(tasks).forEach(task->map.put(task,new HashSet<>()));
        Arrays.stream(mutexPairs).forEach(ints -> map.get(ints[0]).add(ints[1]));

        Set<Integer> curSet=new HashSet<>();

        for(int i=0;i< tasks.length;i++){
            if(curSet.contains(tasks[i])){
                result++;
                curSet.clear();
                curSet.addAll(map.get(tasks[i]));
            }else{
                curSet.addAll(map.get(tasks[i]));
            }
        }
        return result;
    }

链表

143. 重排链表
class Solution {
    public void reorderList(ListNode head) {
        ListNode middle=findMiddle(head);
        ListNode head2=reverseList(middle.next);
        middle.next=null;
        mergeList(head,head2);
    }

    private ListNode reverseList(ListNode listNode){
        ListNode pre=null;
        ListNode cur=listNode;
        while(cur!=null){
            ListNode next=cur.next;
            cur.next=pre;
            pre=cur;
            cur=next;
        }
        return pre;
    }


    private ListNode findMiddle(ListNode listNode){
        ListNode slow=listNode;
        ListNode fast=listNode;
        while(fast!=null&&fast.next!=null){
            slow=slow.next;
            fast=fast.next.next;
        }
        return slow;
    }

    public void mergeList(ListNode l1, ListNode l2) {
        ListNode l1_tmp;
        ListNode l2_tmp;
        while (l1 != null && l2 != null) {
            l1_tmp = l1.next;
            l2_tmp = l2.next;

            l1.next = l2;
            l1 = l1_tmp;

            l2.next = l1;
            l2 = l2_tmp;
        }
    }
}

技巧

前缀树

208. 实现 Trie (前缀树)

前缀和

525. 连续数组

滑动窗口

3. 无重复字符的最长子串
class Solution {
    public int lengthOfLongestSubstring(String s) {
        int maxLen=0,r=0;
        Set<Character> set=new HashSet<>();
        for(int l=0;l<s.length();l++){
            set.add(s.charAt(l));
            while(set.size()<l-r+1){
                if(s.charAt(r)!=s.charAt(l)){
                    set.remove(s.charAt(r));
                }
                r++;
            }
            maxLen=Math.max(maxLen,l-r+1);
        }
        return maxLen;
    }
}
209. 长度最小的子数组
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int min=nums.length;
        for(int r=0,l=0;r< nums.length;r++){
            while(sum(nums,l,r)>=target){
                min=Math.min(min,r-l+1);
                l++;
            }
        }

        return sum(nums,0, nums.length-1)<target?0:min;
    }

    private int sum(int[] nums,int l,int r){
        int sum=0;
        while(l<=r){
            sum=sum+nums[l];
            l++;
        }
        return sum;
    }
}
1004. 最大连续1的个数 III