算法
主要是算法题
嗷嗷嗷嗷_
在读研究生
JAVA 后端
GIS
展开
-
常见排序算法
public void quickSort(int[] arrs){ quickSortCore(arrs, 0, arrs.length - 1);}public void quickSortCore(int[] arrs, int low, int high){ if (low >= high) return; int mark = arrs[low]; int i = low, j = high; while (i < j) { while (arrs[j] >原创 2021-01-07 11:10:28 · 187 阅读 · 1 评论 -
*LeetCode 338 比特位计数(中等)
给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。示例 1:输入: 2输出: [0,1,1]示例 2:输入: 5输出: [0,1,1,2,1,2]进阶:给出时间复杂度为O(n*sizeof(integer))的解答非常容易。但你可以在线性时间O(n)内用一趟扫描做到吗?要求算法的空间复杂度为O(n)。你能进一步完善解法吗?要求在C++或任何其他语言中不使用任何内置函数(如 C++ 中的 __bui原创 2020-12-08 11:37:22 · 81 阅读 · 0 评论 -
LeetCode 337 打家劫舍III(中等)
在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。示例 1:输入: [3,2,3,null,3,null,1] 3 / \ 2 3 \ \ 3原创 2020-12-07 10:30:52 · 135 阅读 · 0 评论 -
*LeetCode 312 戳气球(困难)
class Solution { public int maxCoins(int[] nums) { int n = nums.length; int[] new_nums = new int[n+2]; new_nums[0] = 1; new_nums[n+1] = 1; System.arraycopy(nums,0,new_nums,1,n); int[][]原创 2020-12-06 19:16:38 · 96 阅读 · 0 评论 -
LeetCode 322 零钱兑换(中等)
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。你可以认为每种硬币的数量是无限的。示例 1:输入:coins = [1, 2, 5], amount = 11输出:3解释:11 = 5 + 5 + 1示例 2:输入:coins = [2], amount = 3输出:-1示例 3:输入:coins = [1], amount = 0输出:0示例 4:输入原创 2020-12-06 19:08:11 · 77 阅读 · 0 评论 -
*LeetCode 309 最佳买卖股票时机含冷冻期(中等)
给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。示例:输入: [1,2,3,0,2]输出: 3解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]思路与代码状态机+动态规划参考 leetcode官方题解时间复杂度O(n)原创 2020-12-04 10:38:42 · 69 阅读 · 0 评论 -
*LeetCode 300 最长上升子序列(中等)
动态规划dp[i] 代表以下标i结尾的最长上升子序列大小(最长子序列必须以nums[i]结尾)。时间复杂度 O(n²)空间复杂度 O(n)class Solution { public int lengthOfLIS(int[] nums) { int[] dp = new int[nums.length]; Arrays.fill(dp, 1); int res = 0; for (int i = 0; i < nums原创 2020-12-03 11:18:16 · 56 阅读 · 0 评论 -
*LeetCode 301 删除无效的括号(困难)
删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果。说明: 输入可能包含了除 ( 和 ) 以外的字符。示例 1:输入: “()())()”输出: ["()()()", “(())()”]示例 2:输入: “(a)())()”输出: ["(a)()()", “(a())()”]示例 3:输入: “)(”输出: [""]思路与代码剪枝回溯时间复杂度 O(2^n)class Solution { int minDel = Integer.MAX_VA原创 2020-12-03 11:17:51 · 104 阅读 · 0 评论 -
*LeetCode 287 寻找重复数(中等)
给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。示例 1:输入: [1,3,4,2,2]输出: 2示例 2:输入: [3,1,3,4,2]输出: 3说明:不能更改原数组(假设数组是只读的)。只能使用额外的 O(1) 的空间。时间复杂度小于 O(n²) 。-数组中只有一个重复的数字,但它可能不止重复出现一次。思路与代码暴力破解法对于数组中的每一个元素原创 2020-11-30 10:07:36 · 71 阅读 · 0 评论 -
LeetCode 283 移动零(简单)
class Solution { public void moveZeroes(int[] nums) { int index = 0; int len = nums.length; for (int i = 0; i < len; i++) { if (nums[i] != 0) swap(i, index++, nums); } } public void swap(int a, i.原创 2020-11-27 11:38:02 · 48 阅读 · 0 评论 -
*LeetCode 279 完全平方数(中等)
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。示例 1:输入: n = 12输出: 3解释: 12 = 4 + 4 + 4.示例 2:输入: n = 13输出: 2解释: 13 = 4 + 9.思路与代码动态规划时间复杂度: nnn\sqrt{n}nn空间复杂度:nnnclass Solution { public int numSquares(int n) {原创 2020-11-25 11:01:36 · 57 阅读 · 0 评论 -
LeetCode 240 搜索二维矩阵 II(中等)
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]给定 target = 5,返回 true。给定原创 2020-11-25 10:31:40 · 50 阅读 · 0 评论 -
*LeetCode 239 滑动窗口最大值(困难)
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。进阶:你能在线性时间复杂度内解决此题吗?示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值--------------- -----[1 3 -1原创 2020-11-24 13:24:11 · 88 阅读 · 0 评论 -
*LeetCode 238 除自身以外数组的乘积(中等)
给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。示例:输入: [1,2,3,4]输出: [24,12,8,6]提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。进阶:你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数原创 2020-11-23 10:49:53 · 76 阅读 · 0 评论 -
*LeetCode 236 二叉树的最近公共祖先(简单)
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]示例 1:输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出: 3解释: 节点 5 和节点原创 2020-11-22 10:45:42 · 61 阅读 · 0 评论 -
LeetCode 234 回文链表(简单)
请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?思路与代码O(n) 时间复杂度不难,主要是 O(1) 空间复杂度,这要求我们不能借助其他的数据结构来存取节点。思路1 找到中间几点2 反转后半部分链表3 判断是否回文/** * Definition for singly-linked list.原创 2020-11-21 10:52:48 · 94 阅读 · 0 评论 -
LeetCode 226 翻转二叉树(简单)
翻转一棵二叉树。示例:输入: 4 / \ 2 7 / \ / \1 3 6 9输出: 4 / \ 7 2 / \ / \9 6 3 1思路与代码递归// 前序遍历版 从上往下交换class Solution { public TreeNode invertTree(TreeNode root) { if (root == null) return null;原创 2020-11-20 11:38:14 · 92 阅读 · 0 评论 -
*LeetCode 221 最大正方形(中等)
在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。示例:输入:matrix = [["1","0","1","0","0"], ["1","0","1","1","1"], ["1","1","1","1","1"], ["1","0","0","1","0"]]输出:4思路与代码动态规划dp[i][j]表示以 (i,j)(为右下角,且只包含 '1' 的正方形的边长最大值。核心是dp原创 2020-11-20 11:19:50 · 120 阅读 · 1 评论 -
*LeetCode 215 数组中的第K个最大元素(中等)
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。思路与代码快速排序时间复杂度 O(nlogn)小顶堆时间复杂度 O(nlogk)class Solution { public原创 2020-11-20 10:58:45 · 61 阅读 · 0 评论 -
大顶堆/小顶堆
小顶堆小顶堆是堆顶元素最小(控制堆中元素个数,比堆顶元素大的元素才能入堆,可以用来确定第k大的数)class MinHeap{ private int capacity; private int count; private int[] elements; public MinHeap(int capacity) { this.capacity = capacity; elements = new int[capacity]; }原创 2020-11-19 19:32:40 · 645 阅读 · 0 评论 -
*LeetCode 208 实现Trie(前缀树)(中等)
实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。示例:Trie trie = new Trie();trie.insert("apple");trie.search("apple"); // 返回 truetrie.search("app"); // 返回 falsetrie.startsWith("app"); // 返回 truetrie.insert("app"); trie.search("app");原创 2020-11-17 10:53:57 · 50 阅读 · 0 评论 -
*LeetCode 207 课程表(中等)
class Solution { Map<Integer, List<Integer>> map = new HashMap(); int[] state; public boolean canFinish(int numCourses, int[][] prerequisites) { state = new int[numCourses]; // 0 可以完成的课程 1 搜索中,还不知道可不可以完成的课程 2 还未搜索的课程原创 2020-11-17 10:19:23 · 60 阅读 · 0 评论 -
LeetCode 206 反转链表(简单)
反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?来源:力扣(LeetCode)思路与代码迭代法/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode nex原创 2020-11-13 11:07:05 · 56 阅读 · 0 评论 -
LeetCode 200 岛屿数量(中等)
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入:grid = [ ["1","1","1","1","0"], ["1","1","0","1","0"], ["1","1","0","0","0"], ["0","0","0","0","0"]]输出:1示例 2:输入:grid = [ ["1"原创 2020-11-13 10:44:50 · 150 阅读 · 0 评论 -
LeetCode 198 打家劫舍(简单)
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。示例 2:输入:[2,7,9原创 2020-11-13 10:24:51 · 47 阅读 · 0 评论 -
LeetCode 169 多数元素(简单)
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [3,2,3]输出: 3示例 2:输入: [2,2,1,1,1,2,2]输出: 2思路与代码Boyer-Moore 投票算法如果我们把众数记为 +1,把其他数记为 −1,将它们全部加起来,显然和大于 0,从结果本身我们可以看出众数比其他数多。我们首先给出 Boyer-Moore 算法的详细步骤:原创 2020-11-13 10:11:39 · 2145 阅读 · 0 评论 -
LeetCode 160 相交链表(简单)
编写一个程序,找到两个单链表相交的起始节点。如下面的两个链表:在节点 c1 开始相交。示例 1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Reference of the node with value = 8输入解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0原创 2020-11-12 22:02:05 · 43 阅读 · 0 评论 -
LeetCode 155 最小栈(简单)
设计一个支持 push ,pop,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。示例:输入:[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”][[],[-2],[0],[-3],[],[],[],[]]输出:[null,null,null,null,-原创 2020-11-12 21:45:24 · 45 阅读 · 0 评论 -
*LeetCode 152 乘积最大子数组(中等)
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。示例 1:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。思路与代码动态规划dp[i][0] 以当前下标结尾的最大正乘积dp[i][1] 以当前下表结尾的最小负乘积用max代表dp[i][0],min代表dp[i]原创 2020-11-12 11:00:21 · 92 阅读 · 0 评论 -
*LeetCode 148 排序链表(中等)
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。进阶:你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?示例 1:输入:head = [4,2,1,3]输出:[1,2,3,4]示例 2:输入:head = [-1,5,3,4,0]输出:[-1,0,3,4,5]示例 3:输入:head = []输出:[]/** * Definition for singly-linked list. * public class Lis原创 2020-11-12 09:51:34 · 85 阅读 · 0 评论 -
LeetCode 146 LRU缓存机制(中等)
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。实现 LRUCache 类:LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最原创 2020-11-10 21:40:23 · 80 阅读 · 0 评论 -
LeetCode 141&142 环形链表(简单&中等)
环形链表1给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数pos来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果pos 是-1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回false。进阶:你能用 O(1)(即,常量)内存解决此问题吗?示例 1:输入:head = [3,2,0,-4], p原创 2020-11-10 10:06:26 · 60 阅读 · 0 评论 -
*LeetCode 139 单词拆分(中等)
给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1:输入: s = “leetcode”, wordDict = [“leet”, “code”]输出: true解释: 返回 true 因为 “leetcode” 可以被拆分成 “leet code”。示例 2:输入: s = “applepenapple”, wordDict原创 2020-11-10 09:48:43 · 151 阅读 · 0 评论 -
*LeetCode 128 最长连续序列(困难)
给定一个未排序的整数数组 nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。进阶:你可以设计并实现时间复杂度为O(n)的解决方案吗?示例 1:输入:nums = [100,4,200,1,3,2]输出:4解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。示例 2:输入:nums = [0,3,7,2,5,8,4,6,0,1]输出:9思路与代码哈希表时间复杂度O(n)空间复杂度O(n)class Solution { publi原创 2020-11-08 14:50:03 · 108 阅读 · 0 评论 -
LeetCode 124 二叉树中的最大路径和(困难)
给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。示例 1:输入:[1,2,3] 1 / \ 2 3输出:6示例 2:输入:[-10,9,20,null,null,15,7] -10 / \ 9 20 / \ 15 7输出:42思路与代码递归法class Solution { i原创 2020-11-08 11:23:43 · 110 阅读 · 0 评论 -
LeetCode 121 买卖股票的最佳时机(简单)
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。示例 2:输入:原创 2020-11-07 11:27:18 · 159 阅读 · 0 评论 -
*LeetCode 114 二叉树展开为链表(中等)
给定一个二叉树,原地将它展开为一个单链表。例如,给定二叉树 1 / \ 2 5 / \ \3 4 6将其展开为:1 \ 2 \ 3 \ 4 \ 5 \ 6思路与代码前序遍历把节点按前序遍历的顺序取出,方法一个数组或者队列里,再依次建立新的连接时间复杂度O(n)空间复杂度O(n) 需要额外的数组或队列class Solution {原创 2020-11-07 11:18:56 · 58 阅读 · 0 评论 -
LeetCode 105 从前序与中序遍历序列构造二叉树(中等)
根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7思路与代码递归法时间复杂度:O(n),其中 nn 是树中的节点个数。空间复杂度:O(n),除去返回的答案需要的 O(n) 空间之外,我们还需要使用 O(n)的空间存储哈希映射,以及 O(原创 2020-11-07 10:19:19 · 96 阅读 · 0 评论 -
*LeetCode 72 编辑距离(困难)
大苏打原创 2020-11-06 19:14:00 · 67 阅读 · 0 评论 -
LeetCode 104 二叉树的最大深度(简单)
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最大深度 3 。思路与代码DFS 深度优先搜索时间复杂度 O(n)空间复杂度O(depth)class Solution { public int maxDepth(TreeNode root) {原创 2020-11-06 11:23:11 · 95 阅读 · 0 评论