11 2021 档案

摘要:哈希表 import java.util.ArrayList; import java.util.HashMap; class Solution { public int[] intersect(int[] nums1, int[] nums2) { /** * 用map存储nums1中的元素和出现 阅读全文
posted @ 2021-11-30 20:36 振袖秋枫问红叶 阅读(33) 评论(0) 推荐(0)
摘要:哈希表 import java.util.HashSet; class Solution { public int[] intersection(int[] nums1, int[] nums2) { /** * 用集合set1存储nums1的元素,然后将nums2的元素挨个进行对比 * 如果都存在 阅读全文
posted @ 2021-11-29 17:35 振袖秋枫问红叶 阅读(39) 评论(0) 推荐(0)
摘要:暴力解法 class Solution { public boolean containsNearbyDuplicate(int[] nums, int k) { for (int i = 0; i < nums.length; i++) { for (int j = i + 1; j < nums 阅读全文
posted @ 2021-11-29 14:32 振袖秋枫问红叶 阅读(61) 评论(0) 推荐(0)
摘要:滑动窗口 import java.util.Arrays; class Solution { public String minWindow(String s, String t) { if (s.length() < t.length()){ return ""; } /** * 滑动窗口 * 用 阅读全文
posted @ 2021-11-29 11:38 振袖秋枫问红叶 阅读(54) 评论(0) 推荐(0)
摘要:滑动窗口 import java.util.ArrayList; import java.util.Arrays; import java.util.List; class Solution { public List<Integer> findAnagrams(String s, String p 阅读全文
posted @ 2021-11-25 10:27 振袖秋枫问红叶 阅读(62) 评论(0) 推荐(0)
摘要:滑动窗口 class Solution { public int lengthOfLongestSubstring(String s) { /** * 滑动窗口 * 哈希表存储字符的个数,如果大于0说明重复了 */ int[] count = new int[256]; int left = 0; 阅读全文
posted @ 2021-11-24 22:22 振袖秋枫问红叶 阅读(57) 评论(0) 推荐(0)
摘要:滑动窗口法 class Solution { public int minSubArrayLen(int target, int[] nums) { /** * 滑动窗口 * 两个指针同向移动,如果当前窗口内的元素和大于target就记录长度,然后left指针右移缩小查找范围 * 如果小于targe 阅读全文
posted @ 2021-11-24 14:52 振袖秋枫问红叶 阅读(53) 评论(0) 推荐(0)
摘要:暴力解法(超时) import java.util.Arrays; class Solution { public int maxArea(int[] height) { /** * 暴力解法,直接使用额外数组存放每一个坐标为左边界时的最大面积,最后对数组求最大值 */ int[] res = ne 阅读全文
posted @ 2021-11-24 11:20 振袖秋枫问红叶 阅读(38) 评论(0) 推荐(0)
摘要:双指针法 class Solution { public String reverseVowels(String s) { /** * 双指针法遍历字符串 * s.toCharArray()方法将字符串转为字符数组 * new String(chars)将字符数组转换为字符串(直接用toString 阅读全文
posted @ 2021-11-24 10:19 振袖秋枫问红叶 阅读(43) 评论(0) 推荐(0)
摘要:双指针法 class Solution { public void reverseString(char[] s) { /** * 双指针遍历 */ int left = 0; int right = s.length - 1; char c; while (left < right){ c = s 阅读全文
posted @ 2021-11-24 10:18 振袖秋枫问红叶 阅读(32) 评论(0) 推荐(0)
摘要:双指针法 class Solution { public boolean isPalindrome(String s) { /** * 双指针遍历 * 定义一个判断字符是否为字母的方法 */ int left = 0; int right = s.length() - 1; s = s.toLowe 阅读全文
posted @ 2021-11-24 10:17 振袖秋枫问红叶 阅读(36) 评论(0) 推荐(0)
摘要:二分查找法 class Solution { public int[] twoSum(int[] numbers, int target) { int[] res = new int[2]; /** * 对于每一个元素,在后面的子数组中寻找是否有匹配的元素 * 因为数组是有序的,使用二分查找法寻找更 阅读全文
posted @ 2021-11-23 20:37 振袖秋枫问红叶 阅读(49) 评论(0) 推荐(0)
摘要:双指针法(归并排序法) import java.util.Arrays; class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { /** * 双指针遍历 * 先将两个子数组简单合并,然后分别从子数组第一 阅读全文
posted @ 2021-11-23 17:20 振袖秋枫问红叶 阅读(50) 评论(0) 推荐(0)
摘要:双指针法 class Solution { public int removeDuplicates(int[] nums) { /** * 双指针遍历数组 * 定义一个flag来指示重复元素出现的次数 */ int n = 0; int flag = 0; for (int i = 1; i < n 阅读全文
posted @ 2021-11-23 15:59 振袖秋枫问红叶 阅读(48) 评论(0) 推荐(0)
摘要:双指针法 class Solution { public int removeElement(int[] nums, int val) { /** * 使用双指针从两端遍历,start指向当前遍历元素,end指向最后一个待换元素 * 当遇到目标元素时,和最后一个元素互换 * 头指针等于尾指针时结束循 阅读全文
posted @ 2021-11-23 15:58 振袖秋枫问红叶 阅读(50) 评论(0) 推荐(0)
摘要:双指针法 class Solution { public int removeDuplicates(int[] nums) { /** * 同《80. 删除有序数组中的重复项II》 */ if (nums.length == 1){ return 1; } int length = 1; for ( 阅读全文
posted @ 2021-11-23 15:58 振袖秋枫问红叶 阅读(45) 评论(0) 推荐(0)
摘要:暴力解法 class Solution { public void moveZeroes(int[] nums) { /** * 使用额外的数组存放非零元素 */ int[] temp = new int[nums.length]; int index = 0; for (int i = 0; i 阅读全文
posted @ 2021-11-23 15:57 振袖秋枫问红叶 阅读(35) 评论(0) 推荐(0)
摘要:算法面试的误区 算法面试不代表“正确”回答每一个算法问题,合理的思考方向更重要 把这个过程看作是和面试官一起探讨一个问题的解决方案,对于问题的细节和应用环境,可以和面试官沟通 根据具体情况选择更优的算法 “正确”本身是一个相对的概念,比如对一组数据进行排序,不能忽略应用环境,一味的选择速度快的快速排 阅读全文
posted @ 2021-11-23 15:56 振袖秋枫问红叶 阅读(86) 评论(0) 推荐(0)
摘要:如果定义一个数组,每一个字符都和一个索引相对应,那么对元素的查找操作是O(1)级别的 这个数组就称作哈希表,而将字符转化为对应的索引的方法称为哈希函数,转化以后就可以只在哈希表上操作而无需关注原始的字符 哈希函数的设计思路 哈希表一个很重要的问题是,很难保证每一个元素通过哈希函数的转换,都能对应不同 阅读全文
posted @ 2021-11-19 19:26 振袖秋枫问红叶 阅读(78) 评论(0) 推荐(0)
摘要:哈希表 class Solution { public int firstUniqChar(String s) { int[] arr = new int[26]; /** * 先将所有字母的词频保存下来 */ for (int i = 0; i < s.length(); i++) { arr[s 阅读全文
posted @ 2021-11-18 21:44 振袖秋枫问红叶 阅读(46) 评论(0) 推荐(0)
摘要:2-3树 2-3树满足二分搜索树的基本性质,中间节点的值大于左子树,小于右子树 但是,其节点可以存放1个元素或者2个元素,即每个节点有2个孩子或者3个孩子,分别称为2节点和3节点 2-3树是一种绝对平衡树,任何时候任何节点的子树高度都一样,即要么是叶子节点,要么同时有左(中)右孩子 2-3树如何维持 阅读全文
posted @ 2021-11-17 14:47 振袖秋枫问红叶 阅读(103) 评论(0) 推荐(0)
摘要:二分搜索树最大的问题是,在存储有序的数组时会退化成链表,性能大大降低。需要在现有二分搜索树的基础上添加一些机制,使得其能维持平衡二叉树 而AVL树是最早的自平衡二分搜索树,可以自动平衡的分布节点,避免退化成链表 平衡二叉树 完全二叉树、满二叉树都是平衡二叉树,其所有叶子节点的高度相差不超过1,平衡度 阅读全文
posted @ 2021-11-14 23:05 振袖秋枫问红叶 阅读(65) 评论(0) 推荐(0)
摘要:并查集,又称Union Find,和之前的树结构不同,并查集的指针由孩子指向父亲 常用于解决连接问题,比如网络中节点间的连接状态 对一组数据,并查集主要支持合并和查询两个动作,unionElement(p, q)和isConnected(q, p) 数组实现并查集(Quick Find) 效率低,不 阅读全文
posted @ 2021-11-12 16:48 振袖秋枫问红叶 阅读(67) 评论(0) 推荐(0)
摘要:Trie,又称字典树、前缀树,是一种N叉树 Trie是一种专门为字典设计的数据结构,通常只用来处理字符串;而之前的Map更适合称为映射而不是字典,因为其存储的对象不一定是字符串 如果用TreeMap和Trie来查询字符串,TreeMap的时间复杂度为O(logn),而Trie的时间复杂度和总数n无关 阅读全文
posted @ 2021-11-12 14:02 振袖秋枫问红叶 阅读(146) 评论(0) 推荐(0)
摘要:import java.util.TreeMap; class MapSum { /** * 本题中每个节点还有一个对应的val,可以替代isWord的作用 */ class Node{ int val; TreeMap<Character, Node> next; public Node(int 阅读全文
posted @ 2021-11-11 13:53 振袖秋枫问红叶 阅读(51) 评论(0) 推荐(0)
摘要:import java.util.TreeMap; class WordDictionary { class Node{ boolean isWord; TreeMap<Character, Node> next; public Node(){ isWord = false; next = new 阅读全文
posted @ 2021-11-11 10:32 振袖秋枫问红叶 阅读(37) 评论(0) 推荐(0)
摘要:import java.util.TreeMap; class Trie { class Node{ boolean isWord; TreeMap<Character, Node> next; public Node(){ next = new TreeMap<>(); isWord = fals 阅读全文
posted @ 2021-11-10 20:16 振袖秋枫问红叶 阅读(38) 评论(0) 推荐(0)
摘要:对于有一类问题,我们关心的是一个线段(区间),比如区间染色、区间查询 对于一个给定的区间,更新区间中一个元素的值或者查询区间中的最大最小值或者总和,使用线段树更快,又称区间树 线段树是一种平衡二叉树(最大深度和最小深度差值<=1,堆也是平衡二叉树),其节点存储的是一个区间的信息,比如该区间的总和,根 阅读全文
posted @ 2021-11-10 15:45 振袖秋枫问红叶 阅读(107) 评论(0) 推荐(0)
摘要:import java.util.TreeMap; class MyCalendar { TreeMap<Integer, Integer> treeMap; public MyCalendar() { treeMap = new TreeMap(); } public boolean book(i 阅读全文
posted @ 2021-11-10 15:41 振袖秋枫问红叶 阅读(74) 评论(0) 推荐(0)
摘要:class NumArray { SegmentTree segmentTree; public NumArray(int[] nums) { segmentTree = new SegmentTree(nums); } public void update(int index, int val) 阅读全文
posted @ 2021-11-10 14:27 振袖秋枫问红叶 阅读(37) 评论(0) 推荐(0)
摘要:/** * 对于不可变数组,用线段树反而更麻烦 */ class NumArray { int[] sum; public NumArray(int[] nums) { /** * 提前保存前n个元素的和,sum[i]保存的是前i个元素,不包括自身 * 区间和就是左右边界前缀和的差 */ sum = 阅读全文
posted @ 2021-11-10 13:52 振袖秋枫问红叶 阅读(32) 评论(0) 推荐(0)
摘要:复杂度总结 7大比较排序算法 时间复杂度 空间复杂度 特殊情况下的优化 应用 选择排序 O(n^2) O(1) \ \ 插入排序 O(n^2) O(1) 完全有序数组,O(n) \ 冒泡排序 O(n^2) O(1) 完全有序数组,O(n) \ 归并排序 O(nlogn) O(n) 完全有序数组,O( 阅读全文
posted @ 2021-11-04 23:18 振袖秋枫问红叶 阅读(125) 评论(0) 推荐(0)
摘要:基本思想:通过循环,让数组越来越有序 冒泡排序法在每次循环时只处理相邻的逆序对,当一个较小的元素在后面的时候,每次也只能往前挪一位,效率很低,但会让数组变得更加有序 而插入排序法在数组有序的时候,只需要和前面的一个元素比较大小,就可以终止循环 因此,希尔排序法在冒泡排序法和插入排序法的基础上,不仅仅 阅读全文
posted @ 2021-11-04 17:37 振袖秋枫问红叶 阅读(178) 评论(0) 推荐(0)
摘要:基本思想:每次只比较相邻的两个元素,如果前者比后者大就互换,每一轮会找出最大的元素,放在最后的位置,而最后的位置每轮会往前挪一位 循环不变量:第i轮时,arr[n- i, n)已排好序,在arr[n - i - 1]放上正确的元素 实现冒泡排序法 import java.util.Arrays; p 阅读全文
posted @ 2021-11-04 17:36 振袖秋枫问红叶 阅读(158) 评论(0) 推荐(0)
摘要:什么是优先队列 普通队列:先进先出,后进后出 优先队列:出队顺序和入队顺序无关,和优先级相关 实现优先队列的数据结构 入队 出队(拿出最大元素) 普通线性结构 O(1) O(n) 顺序线性结构 O(n) O(1) 堆 O(logn) O(logn) interface Queue<E> { int 阅读全文
posted @ 2021-11-02 09:04 振袖秋枫问红叶 阅读(75) 评论(0) 推荐(0)
摘要:优先队列 import java.util.Comparator; import java.util.PriorityQueue; class Solution { public String[] findRelativeRanks(int[] score) { /** * 使用优先队列从小到大存储 阅读全文
posted @ 2021-11-01 21:58 振袖秋枫问红叶 阅读(58) 评论(0) 推荐(0)
摘要:class KthLargest { int k; PriorityQueue<Integer> pq; public KthLargest(int k, int[] nums) { this.k = k; pq = new PriorityQueue<>(); for (int i = 0; i 阅读全文
posted @ 2021-11-01 21:18 振袖秋枫问红叶 阅读(42) 评论(0) 推荐(0)
摘要:优先队列 import java.util.Comparator; import java.util.PriorityQueue; class Solution { public int[] kWeakestRows(int[][] mat, int k) { /** * 使用优先队列 * 如果两行 阅读全文
posted @ 2021-11-01 21:06 振袖秋枫问红叶 阅读(51) 评论(0) 推荐(0)
摘要:优先队列 import java.util.Collections; import java.util.PriorityQueue; class Solution { public int maxProduct(int[] nums) { /** * 使用优先队列 */ PriorityQueue< 阅读全文
posted @ 2021-11-01 21:06 振袖秋枫问红叶 阅读(41) 评论(0) 推荐(0)
摘要:优先队列 import java.util.Collections; import java.util.PriorityQueue; class Solution { public int lastStoneWeight(int[] stones) { /** * 使用优先队列创建最大堆 * Col 阅读全文
posted @ 2021-11-01 16:55 振袖秋枫问红叶 阅读(44) 评论(0) 推荐(0)
摘要:优先队列 import java.util.PriorityQueue; class KthLargest { /** * 使用优先队列创建最小堆,最多存放三个元素 * 每次添加新元素时和堆顶元素进行比较,堆顶元素就一直是第k大的元素 */ PriorityQueue<Integer> pq = n 阅读全文
posted @ 2021-11-01 16:42 振袖秋枫问红叶 阅读(51) 评论(0) 推荐(0)