• Leetcode题目分类整理


    一、数组

    8) 双指针 ---- 滑动窗口

    例题:

        3. Longest Substring Without Repeating Characters

    描述:Given a string, find the length of the longest substring without repeating characters.

    题解:时间:92.67%,空间:87.02%

     1     public int lengthOfLongestSubstring(String s) {   
     2         // check
     3         if(s == null || s.length() == 0) return 0;
     4         
     5         // initial 
     6         int[] freq = new int[256];
     7         Arrays.fill(freq, -1);
     8         int l = 0, r = 0, res = 0;
     9         
    10         while(r < s.length()){
    11             if(freq[s.charAt(r)] != -1) l = Math.max(l, freq[s.charAt(r)] + 1);
    12             freq[s.charAt(r)] = r++;
    13             res = Math.max(res, r - l);
    14         }
    15         
    16         return res;
    17     }

    练习:

    438. Find All Anagrams in a String

     76. Minimum Window Substring

    二、查找问题 

    1)查找有无:是否存在

    2)查找对应关系:出现了几次

    349. Intersection of Two Arrays   // 熟悉Set

    描述:Given two arrays, write a function to compute their intersection.

    Input: nums1 = [1,2,2,1], nums2 = [2,2]
    Output: [2]
     1     public int[] intersection(int[] nums1, int[] nums2) {
     2         if(nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) 
     3             return new int[0];
     4         
     5         Set<Integer> set1 = new HashSet<Integer>();
     6         Set<Integer> setTemp = new HashSet<Integer>();
     7         
     8         for(int num : nums1) set1.add(num);
     9         for(int num : nums2) if(set1.contains(num)) setTemp.add(num);
    10             
    11         int k = setTemp.size();
    12         int[] res = new int[k];
    13         for(int num : setTemp) res[--k] = num;
    14         
    15         return res;    
    16     }

    350. Intersection of Two Arrays II          // 熟悉 Map

    描述:Given two arrays, write a function to compute their intersection.

    Input: nums1 = [1,2,2,1], nums2 = [2,2]
    Output: [2,2]
     1     public int[] intersect(int[] nums1, int[] nums2) {
     2         if(nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0)
     3             return new int[0];
     4         
     5         Map<Integer, Integer> map = new HashMap<Integer, Integer>();
     6         for(int num : nums1){
     7             map.put(num, map.getOrDefault(num, 0) + 1);
     8         }
     9         
    10         List<Integer> list = new ArrayList<Integer>();
    11         for(int num : nums2){
    12             if(map.get(num) != null && map.get(num) > 0){
    13                 list.add(num);
    14                 map.put(num, map.get(num) - 1);
    15             }
    16         }
    17         
    18         int k = list.size();
    19         int[] arr = new int[k];
    20         for(int num : list) arr[--k] = num;
    21         
    22         return arr;
    23     }

    242. Valid Anagram

    题目描述:Given two strings s and , write a function to determine if t is an anagram of s.

    202. Happy Number

    290. Word Pattern

    205. Isomorphic Strings

    451. Sort Characters By Frequency

    查找表的经典问题:

    1. Two Sum

    Given an array of integers, return indices of the two numbers such that they add up to a specific target.

    You may assume that each input would have exactly one solution, and you may not use the same element twice.

    时间:99.77%,空间:88.15% 

    1     public int[] twoSum(int[] nums, int target) {
    2         Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    3         for(int i = 0; i < nums.length; i++){
    4             int de = target - nums[i];
    5             if(map.get(de) != null) return new int[]{map.get(de), i};
    6             map.put(nums[i], i);
    7         }
    8         return new int[2];
    9     }

    15. 3Sum

    18. 4Sum

    16. 3Sum Closest

    454. 4Sum II

    描述:Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) there are such that A[i] + B[j] + C[k] + D[l] is zero.

    To make problem a bit easier, all A, B, C, D have same length of N where 0 ≤ N ≤ 500. All integers are in the range of -2^28 to 2^28 - 1 and the result is guaranteed to be at most 2^31 - 1.

     1     public int fourSumCount(int[] A, int[] B, int[] C, int[] D) {
     2         Map<Integer, Integer> map = new HashMap<Integer, Integer>();
     3         for(int a : A)
     4             for(int b : B)
     5                 map.put(a + b, map.getOrDefault(a + b, 0) + 1);
     6         
     7         int res = 0;
     8         for(int c : C)
     9             for(int d : D){
    10                 if(map.getOrDefault(0 - c - d, 0) > 0){
    11                     res += map.get(0 - c - d);
    12                 }
    13             }
    14         return res;        
    15     }

    49. Group Anagrams

    447. Number of Boomerangs

    Given n points in the plane that are all pairwise distinct, a "boomerang" is a tuple of points (i, j, k) such that the distance between i and j equals the distance between i and k (the order of the tuple matters).

    Find the number of boomerangs. You may assume that nwill be at most 500 and coordinates of points are all in the range [-10000, 10000] (inclusive).

     1     public int numberOfBoomerangs(int[][] points) {
     2         if(points == null || points.length == 0) return 0;
     3         Map<Integer, Integer> maps = new HashMap<Integer, Integer>();
     4         int res = 0;
     5         for(int i = 0; i < points.length; i++){
     6             for(int j = 0; j < points.length; j++){
     7                 int distance = (points[i][0] - points[j][0]) * (points[i][0] - points[j][0]) + 
     8                     (points[i][1] - points[j][1]) * (points[i][1] - points[j][1]);
     9                 maps.put(distance, maps.getOrDefault(distance, 0) + 1);
    10             }
    11             
    12             for(Map.Entry<Integer, Integer> map : maps.entrySet()) 
    13                 res += map.getValue() * (map.getValue() - 1);  
    14             maps.clear();
    15         }
    16         
    17         return res;
    18     }

    149. Max Points on a Line

     滑动窗口+查找表

     219. Contains Duplicate II

    Given an array of integers and an integer k, find out whether there are two distinct indices i and j in the array such that nums[i] = nums[j] and the absolute difference between i and j is at most k.

     1     public boolean containsNearbyDuplicate(int[] nums, int k) {
     2         if(nums == null || nums.length == 0 || k <= 0) return false;
     3         Set<Integer> set = new HashSet<Integer>();
     4         
     5         for(int i = 0; i < nums.length; i++){
     6             if(i < k + 1) {
     7                 set.add(nums[i]);
     8                 if(set.size() < i+1) return true;
     9                 continue;
    10             }
    11             set.remove(nums[i - k - 1]);
    12             set.add(nums[i]);
    13             if(set.size() < k+1) return true;
    14         }
    15         
    16         return false;
    17     }

     217. Contains Duplicate

    220. Contains Duplicate III

    Given an array of integers, find out whether there are two distinct indices i and j in the array such that the absolute difference between nums[i] and nums[j] is at most t and the absolute difference between iand j is at most k.

    不是优秀的解法:

     1     public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
     2         if(nums == null || nums.length == 0 || t < 0 || k <= 0) return false;
     3         
     4         TreeSet<Long> set = new TreeSet<Long>();
     5         for(int i = 0; i < nums.length; i++){
     6             if(set.ceiling((long)nums[i] - t) != null  && set.floor((long)nums[i] + t) != null 
     7                && set.ceiling((long)nums[i] - t) - set.floor((long)nums[i] + t) <= 2 * (long)t)
     8                 return true;
     9             
    10             set.add((long)nums[i]);
    11             if(set.size() > k) set.remove((long)nums[i - k]);
    12         }
    13         
    14         return false;
    15     }

     链表

    206. Reverse Linked List

    Reverse a singly linked list.

    Input: 1->2->3->4->5->NULL
    Output: 5->4->3->2->1->NULL
     1     public ListNode reverseList(ListNode head) {        
     2         ListNode pre = null;
     3         ListNode cur = head;
     4         ListNode next = null;
     5         
     6         while(cur != null){
     7             next = cur.next;
     8             cur.next = pre;
     9             pre = cur;
    10             cur = next;
    11         }
    12         
    13         return pre;
    14     }

    92. Reverse Linked List II

    链表基础操作

    83. Remove Duplicates from Sorted List

    86. Partition List

    328. Odd Even Linked List

    2. Add Two Numbers

    445. Add Two Numbers II

    虚拟头节点

    203. Remove Linked List Elements

    Remove all elements from a linked list of integers that have value val.

     1     public ListNode removeElements(ListNode head, int val) {
     2         ListNode tempNode = new ListNode(0);
     3         tempNode.next = head;
     4         ListNode cur = tempNode;
     5         while(cur.next != null){
     6             if(cur.next.val == val) cur.next = cur.next.next;
     7             else cur = cur.next;
     8         }
     9         return tempNode.next;
    10     }

    82. Remove Duplicates from Sorted List II

    21. Merge Two Sorted Lists

    24. Swap Nodes in Pairs

    Given a linked list, swap every two adjacent nodes and return its head.

    You may not modify the values in the list's nodes, only nodes itself may be changed.

     1     public ListNode swapPairs(ListNode head) {
     2         ListNode top = new ListNode(0);
     3         top.next = head;
     4         ListNode node = top;
     5 
     6         while(node.next != null && node.next.next != null){
     7             ListNode first = node.next;
     8             ListNode second = first.next;
     9             
    10             node.next = second;
    11             first.next = second.next;
    12             second.next =first;
    13             
    14             node = node.next.next;
    15         }
    16         
    17         return top.next;
    18     }

    25. Reverse Nodes in k-Group

    链表排序

    147. Insertion Sort List

    148. Sort List

    改变值

    237. Delete Node in a Linked List

    1 class Solution {
    2     public void deleteNode(ListNode node) {
    3         node.val = node.next.val;
    4         node.next = node.next.next;
    5     }
    6 }

    链表与双指针

    19. Remove Nth Node From End of List

    Given a linked list, remove the n-th node from the end of list and return its head.

     1     public ListNode removeNthFromEnd(ListNode head, int n) {
     2         // LeetCode对特殊情况出现的少,比如 head 为空, n的验证等
     3         
     4         ListNode top = new ListNode(0);
     5         top.next = head;
     6         
     7         ListNode l = top, r = top;
     8         while(n > 0){
     9             r = r.next;
    10             n--;
    11         }
    12         while(r.next != null){
    13             l = l.next;
    14             r = r.next;
    15         }
    16         l.next = l.next.next;
    17         
    18         return top.next;
    19     }

    61. Rotate List

    143. Reorder List

    234. Palindrome Linked List

    栈和队列的使用

    20. Valid Parentheses

    Given a string containing just the characters '('')''{''}''[' and ']', determine if the input string is valid.

    An input string is valid if:

    1. Open brackets must be closed by the same type of brackets.
    2. Open brackets must be closed in the correct order.

    Note that an empty string is also considered valid.

     1     public boolean isValid(String s) {
     2         if(s == null || s.length() == 0) return true;
     3         Stack<Character> stack = new Stack<Character>();
     4         HashMap<Character, Character> map = new HashMap<Character, Character>();
     5         map.put('(', ')'); map.put('[', ']'); map.put('{', '}');
     6         
     7         for(int i = 0; i < s.length(); i++){
     8             Character c = s.charAt(i);
     9             if(c == '(' || c == '[' || c == '{') stack.push(c);
    10             else if(stack.size() == 0) return false;
    11             else {
    12                 Character c1 = map.get(stack.pop());
    13                 if (c != c1) return false;
    14             }
    15         }
    16         
    17         return stack.empty();
    18     }

    150. Evaluate Reverse Polish Notation

    71. Simplify Path

    栈和递归

    二叉树的递归:

    前序遍历 144、

    递归的方式

     1     public List<Integer> preorderTraversal(TreeNode root) {
     2         List<Integer> list = new ArrayList<Integer>();
     3         if(root == null) return list;
     4         
     5         recursivePreOrder(list, root);
     6         
     7         return list;
     8     }
     9     
    10     private void recursivePreOrder(List<Integer> list, TreeNode root){
    11         if(root == null) return;
    12         list.add(root.val);
    13         recursivePreOrder(list, root.left);
    14         recursivePreOrder(list, root.right);
    15     }

    中序遍历 94、

    递归的方式

     1     public List<Integer> inorderTraversal(TreeNode root) {
     2         List<Integer> list = new ArrayList<Integer>();
     3         if(root == null) return list;
     4         
     5         recursivePreOrder(list, root);
     6         
     7         return list; 
     8     }
     9     private void recursivePreOrder(List<Integer> list, TreeNode root){
    10         if(root == null) return;
    11         recursivePreOrder(list, root.left);
    12         list.add(root.val);
    13         recursivePreOrder(list, root.right);
    14     }

    后序遍历 145

    递归的方式

     1     public List<Integer> postorderTraversal(TreeNode root) {
     2         List<Integer> list = new ArrayList<Integer>();
     3         if(root == null) return list;
     4         
     5         recursivePreOrder(list, root);
     6         
     7         return list; 
     8     }
     9     private void recursivePreOrder(List<Integer> list, TreeNode root){
    10         if(root == null) return;
    11         recursivePreOrder(list, root.left);
    12         recursivePreOrder(list, root.right);
    13         list.add(root.val);
    14     }

    341. Flatten Nested List Iterator

    队列

    广度优先遍历

    102. Binary Tree Level Order Traversal

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).

     1     public List<List<Integer>> levelOrder(TreeNode root) {
     2         List<List<Integer>> lists = new ArrayList<List<Integer>>();
     3         if(root == null) return lists;
     4         
     5         Queue<TreeNode> queue = new LinkedList<TreeNode>();
     6         queue.add(root);
     7         while(!queue.isEmpty()){
     8             List<Integer> list = new ArrayList<Integer>();
     9             int levelSize = queue.size();
    10             for(int i = 0; i < levelSize; i++){
    11                 TreeNode node = queue.poll();
    12                 if(node.left != null) queue.add(node.left);
    13                 if(node.right != null) queue.add(node.right);
    14                 list.add(node.val);
    15             }
    16             lists.add(list);
    17         }
    18         
    19         return lists;
    20     }

    107. Binary Tree Level Order Traversal II

    103. Binary Tree Zigzag Level Order Traversal

    199. Binary Tree Right Side View

    BFS和图的最短路径

    279. Perfect Squares

    Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...) which sum to n.

     1 class Solution {
     2     // 不是我写的
     3     public int numSquares(int n) {
     4         Queue<Node> queue = new LinkedList<Node>();
     5         queue.add(new Node(n, 0));
     6         int[] visit = new int[n+1];
     7         
     8         while(!queue.isEmpty()){
     9             Node node = queue.poll();
    10             int num = node.num;
    11             int step = node.step;
    12             
    13             for(int i = 0; ; i++){
    14                 int a = num - i * i;
    15                 if(a < 0) break;
    16                 if(a == 0) return step + 1;
    17                 if(visit[a] == 1) continue;
    18                 queue.add(new Node(num - i * i, step + 1));
    19                 visit[a] = 1;
    20             }
    21         }
    22         return -1;
    23     }
    24 }
    25 class Node{
    26     int num;
    27     int step;
    28     public Node(int num, int step){
    29         this.num = num;
    30         this.step = step;
    31     }
    32 }

    127. Word Ladder

    126. Word Ladder II

    优先队列

    347. Top K Frequent Elements

    23. Merge k Sorted Lists

  • 相关阅读:
    CentOS-Docker安装RabbitMQ(单点)
    CentOS-关闭防火墙和禁用安全策略
    CentOS-Docker搭建VeryNginx
    CentOS7-磁盘扩容(LVM-非空目录拓展卷空间大小)
    (六十二)Activity的启动模式(转载自http://blog.csdn.net/android_tutor/article/details/6310015)
    (一)关于SWT程序的基本架构,如何使用控件以及使用Image,Font,Color等图形资源内容
    (六十一)eclipse老是卡顿的问题解决办法
    (六十一)Activity启动模式 及 Intent Flags 与 栈 的关联分析(转载自:http://blog.csdn.net/vipzjyno1/article/details/25463457)
    (六十)工具方法---隐藏软键盘
    iOS 语音朗读
  • 原文地址:https://www.cnblogs.com/tf-Y/p/10412101.html
Copyright © 2020-2023  润新知