算法
算法
Mason97
这个作者很懒,什么都没留下…
展开
-
Kruskal算法 | 最小生成树
按照边权值从小到大排列:依次回填,如果没有形成环,就会被选中。如果形成了环,就舍弃【用并查集进行判断】直到选中了n-1个边,结束。原创 2021-01-20 09:49:57 · 201 阅读 · 0 评论 -
厄拉多塞筛法 | 找质数的方法
筛选法又称筛法,具体做法是:先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。...原创 2020-12-03 11:08:10 · 387 阅读 · 0 评论 -
【leetcode】78. 子集
用动态规划:/** * @Auther: Mason * @Date: 2020/09/20/8:13 * @Description: *//*给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。用动态规划的方法进行解题。 */class Solution { public static void main(String[] args) { Solution s = new Solution(); .原创 2020-09-20 08:55:32 · 124 阅读 · 0 评论 -
【leetcode】两数之和;三数之和;四数之和
两数之和可以排序,然后双指针;也可以用hashmap,记录数字和序号。遍历。三数之和升序排列,然后用三指针。第一个指针遍历。第二个指针遍历。第三个指针从后往前走。四数之和升序排列,用四指针。其实就是四层遍历。/** * @Auther: Mason * @Date: 2020/09/15/7:56 * @Description: */class Solution { public static void main(String[] args) { Soluti原创 2020-09-15 08:44:11 · 121 阅读 · 0 评论 -
【leetcode】77. 组合
我用的方法是 搜索回溯的方法。/** * @Auther: Mason * @Date: 2020/09/08/8:12 * @Description: */class Solution { public static void main(String[] args) { Solution s = new Solution(); List<List<Integer>> list = s.combine(4, 2); .原创 2020-09-08 09:02:44 · 172 阅读 · 0 评论 -
【LeetCode】486. 预测赢家
自己没有做出来,看了官方的解答,我用dp[i][j]表示,作为先手,数组的起止坐标为i和j,自己获得的积分和对手获取积分差值的最大值。有状态转移方程:dp[i][j] = max{nums[i]-dp[i+1][j], nums[j]-dp[i][j-1]},用动态规划的方式来解决这道题目。/** * @Auther: Mason * @Date: 2020/09/01/8:15 * @Description: */// [1,5,233,7] 并不是拿最大的就好。比如我先拿1,你不管拿哪.原创 2020-09-01 19:44:04 · 303 阅读 · 0 评论 -
【leetcode】79. 单词搜索
搜索回溯/** * @Auther: Mason * @Date: 2020/08/25/20:30 * @Description: */class Solution { public boolean exist(char[][] board, String word) { // 我的思路是,建立一个map,key是字母,value是list,list中存储坐标值。 // 这样,当给一个word时,我就知道打头的坐标了。然后遍历word余下的字母。看是.原创 2020-08-25 21:12:05 · 128 阅读 · 0 评论 -
【leetcode】201. 数字范围按位与【先转化;然后是一道数学题目】
先转化问题,就是求出 m和n两个数字的公共二进制前缀是多少。可以利用 n&(n-1) 去除最右面的1来求出结果。class Solution { public int rangeBitwiseAnd(int m, int n) { // 思路是 找到 m 和 n 的公共前缀。就是结果。 // 方法一:同时右移,直到相等。然后恢复。 // 方法二:利用 n&(n-1) 能够 去除 最右位的 1,处理n,直到n<=m 就是结果.原创 2020-08-23 09:44:01 · 128 阅读 · 0 评论 -
【LeetCode】6. Z 字形变换
思路一:计算下标序号。/** * @Auther: Mason * @Date: 2020/07/23/15:35 * @Description: *//*将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I R E T O E S I I G E D H N之后,你的输出需要从左往右逐行读取,产生出一.原创 2020-07-23 18:11:23 · 133 阅读 · 0 评论 -
【LeetCode】33. 搜索旋转排序数组
就是二分查找的思路。稍加变式而已。/** * @Auther: Mason * @Date: 2020/07/23/9:45 * @Description: *//*假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。 */.原创 2020-07-23 11:06:07 · 217 阅读 · 0 评论 -
【LeetCode】剑指 Offer 11. 旋转数组的最小数字
思路一遍历。复杂度为O(n)/** * @Auther: Mason * @Date: 2020/07/22/9:04 * @Description: */public class Solution { public int minArray(int[] numbers) { int len = numbers.length; if (len == 1) return numbers[0]; // 如果第一个数小于最后一个数,肯定第一.原创 2020-07-22 09:50:13 · 126 阅读 · 0 评论 -
【LeetCode】95. 不同的二叉搜索树 II
/** * @Auther: Mason * @Date: 2020/07/21/9:21 * @Description: */// 输入一个正整数n// 输出以1,2,3....n 为节点的二叉搜索树。// 左边的结点都小于根节点,右边的结点都大于根节点。public class Solution { public List<TreeNode> generateTrees(int n) { if (n == 0) return new LinkedL.原创 2020-07-21 10:17:05 · 100 阅读 · 0 评论 -
【LeetCode】1362. 最接近的因数
思路一我找出所有的相乘等于num+1或者num+2的 两个数。更新他们的距离。从而获得最终的结果。/** * @Auther: Mason * @Date: 2020/07/20/15:24 * @Description: */public class Solution { public int[] closestDivisors(int num) { int[] res = new int[2]; double range = Math.sqrt(.原创 2020-07-20 15:58:18 · 231 阅读 · 0 评论 -
【LeetCode】55. 跳跃游戏
第一种思路:使用深度优先遍历的方法。假设第一个数为3。我就去序号为3的位置。。。。,去序号为2的位置。。。,去序号为1的位置。。。 最后看看 能不能到最后一个位置。结果速度很慢。/** * @Auther: Mason * @Date: 2020/07/20/10:02 * @Description: */// 仍然是一道 深度优先遍历的题目。public class Solution { boolean[] mark; public boolean canJum.原创 2020-07-20 13:49:46 · 105 阅读 · 0 评论 -
【LeetCode】841. 钥匙和房间
思路:深度优先遍历即可。/** * @Auther: Mason * @Date: 2020/07/20/9:28 * @Description: */public class Solution { public int count; // 计数有几个房间现在可以打开 public boolean[] mark; // 标记某个房间是否可以被打开。 public int size; // 屋子的总个数。 public boolean canVisitAl.原创 2020-07-20 09:38:56 · 118 阅读 · 0 评论 -
【LeetCode】494. 目标和
第一种思路:全部遍历。复杂度为O(2^n)/** * @Auther: Mason * @Date: 2020/07/15/11:14 * @Description: */public class Solution { private int res = 0; public int findTargetSumWays(int[] nums, int S) { // 给定一个非负整数数组 // 对于数组中的任意一个整数,你都可以从 + 或 -中.原创 2020-07-15 16:01:59 · 157 阅读 · 0 评论 -
【LeetCode】560. 和为K的子数组
思路一:双层循环复杂度为O(n^2),复杂度比较高。/** * @Auther: Mason * @Date: 2020/07/15/10:10 * @Description: */public class Solution { // 找到该数组中和为 k 的连续的子数组的个数 // 直观的想法是,两层循环。第一层循环遍历 子数组的起始位置。 // 第二层循环遍历 子数组的中止位置。 public int subarraySum(int[] nums, in.原创 2020-07-15 10:56:25 · 153 阅读 · 0 评论 -
【LeetCode】1512. 好数对的数目
比较简单的一道题目。用哈希表解决。/** * @Auther: Mason * @Date: 2020/07/15/9:29 * @Description: */public class Solution { public int numIdenticalPairs(int[] nums) { // 我的思路是,建立一个hashMap,存入,数字和次数。 // 向后遍历。如果map中有这个数。结果中增加这个数迄今出现的次数就好了。 Has.原创 2020-07-15 09:34:43 · 455 阅读 · 0 评论 -
【LeetCode】96. 不同的二叉搜索树
思路一我的思路是,用递归的方法。因为二叉搜索树的定义。左边的结点都小于根节点。右边的结点都大于根节点。假设排好顺序,确定左右子树的结点个数分别是多少。递归下去就可以了。/** * @Auther: Mason * @Date: 2020/07/15/9:07 * @Description: */public class Solution { // 给一个数n,问用1,2,3...n 构成的二叉搜索树有多少种。 // 可以采用递归的方法求解。 public int n.原创 2020-07-15 09:27:37 · 128 阅读 · 0 评论 -
【LeetCode】438. 找到字符串中所有字母异位词--------------【滑动窗口解题】
遍历,然后判断子串和目标字符串是否异位相同/** * @Auther: Mason * @Date: 2020/07/14/17:25 * @Description: */// p是要找的字符串// s是内容。public class Solution { public List<Integer> findAnagrams(String s, String p) { List<Integer> list = new LinkedList&..原创 2020-07-14 22:19:03 · 155 阅读 · 0 评论 -
【LeetCode】98. 验证二叉搜索树
用递归来实现。需要保证根节点左边都比根节点的数值小;根节点右边都比根节点的数值大/** * @Auther: Mason * @Date: 2020/07/14/16:37 * @Description: */public class Solution { public boolean isValidBST(TreeNode root) { return isValidBST(root, null, null); } public boolean is.原创 2020-07-14 17:04:54 · 227 阅读 · 0 评论 -
【LeetCode】15. 三数之和
可以用三层循环的方法,O(n^3)改进的三层循环:先进行排序,第二层和第三层循环采用两指针相遇问题。这样,复杂度为O(n^2)/** * @Auther: Mason * @Date: 2020/07/14/9:43 * @Description: */public class Solution { public List<List<Integer>> threeSum(int[] nums) { int len = nums.length;.原创 2020-07-14 10:29:14 · 135 阅读 · 0 评论 -
【LeetCode】139. 单词拆分
搜索回溯算法/** * @Auther: Mason * @Date: 2020/07/12/17:36 * @Description: */// 我觉得使用搜索回溯算法,进行查找public class Solution { public boolean wordBreak(String s, List<String> wordDict) { int len = s.length(); boolean res = search(s, 0,原创 2020-07-12 21:10:07 · 133 阅读 · 0 评论 -
【LeetCode】621. 任务调度器
官方解法:进行排序操作比如冷却时间为5。我6个一组进行排序。每次排序将剩的最多的任务放在前面。一种贪心的思想。反之,空闲碎片会更多。public int leastInterval(char[] tasks, int n) { int taskNum = tasks.length; // 一共的任务数量 int[] map = new int[26];//用来记录每一种任务的个数 for (char task : tasks) { map[task - 'A..原创 2020-07-11 19:20:10 · 106 阅读 · 0 评论 -
【LeetCode】3. 无重复字符的最长子串
用滑动窗口的思路来解题。/** * @Auther: Mason * @Date: 2020/06/30/9:41 * @Description: 请你找出其中不含有重复字符的 最长子串 的长度。 */public class Solution { public int lengthOfLongestSubstring(String s) { if (s == null || s.length() == 0) return 0; // 用滑动窗口的方.原创 2020-06-30 10:35:02 · 126 阅读 · 0 评论 -
【LeetCode】146. LRU缓存机制
官方解法:创建一个双向链表,实现这个功能。用一个hashMap来进行映射,判断链表中是否有某个key,并O(1)找到这个node/** * 当缓存容量达到上限时, * 它应该在写入新数据之前删除最久未使用的数据值, * 从而为新的数据值留出空间。 */// 用一个双向链表来解题。用hashMap来查找是否有键值对。class LRUCache { public static void main(String[] args) { LRUCache lruCache =..原创 2020-06-18 10:13:40 · 147 阅读 · 0 评论 -
【LeetCode】14. 最长公共前缀
我的做法:创建一个方法能够返回两个字符串的最长的公共前缀子串。然后遍历数组。运行比较慢。public class Solution { public String longestCommonPrefix(String[] strs) { if (strs == null) return null; if (strs.length == 0) return ""; String res = strs[0]; for (int .原创 2020-06-15 22:54:13 · 145 阅读 · 0 评论 -
【LeetCode】200. 岛屿数量
深度优先搜索public class Solution { public int numIslands(char[][] grid) { // 岛屿数量的题目。搜索回溯来解题。 // 遍历二维数组。如果这个地方为0,下一个。 // 如果这个地方为1,结果加一。把所有相连的1都置为0 int row = grid.length; if (row == 0) return 0; int column = g原创 2020-06-12 10:03:12 · 121 阅读 · 0 评论 -
【LeetCode】142. 环形链表 II
我的思路是创建一个setpublic class Solution { public ListNode detectCycle(ListNode head) { // 判断一个链表是否有环,返回环的入口,否则返回null // 用快慢指针的方法。可以判断一个链表是否有环,但是怎么返回环的入口处呢。 // 我采用创建一个set的方法,存储next。如果遍历到某一结点。next在set中,那么就找到了入口。 // 如果 一直到null.原创 2020-06-12 09:40:03 · 128 阅读 · 0 评论 -
【LeetCode】207. 课程表 拓扑排序
拓扑排序的作用:将有向图的顶点排成一个线性序列拓扑排序主要用来解决有向图中的依赖解析(dependency resolution)问题主要的思路就是找到入度为0的结点。去除。将他的连着的子结点的入度都减一。然后重复这个过程。就得到了拓扑排序。public class Solution { public boolean canFinish(int numCourses, int[][] prerequisites) { // 拓扑排序的一道题目 // 拓扑排序..原创 2020-06-10 17:47:33 · 163 阅读 · 0 评论 -
【LeetCode】6个股票问题
总的状态转移方程:121. 买卖股票的最佳时机只能有一次买入,一次买出。求出最大的利润是多少。我起初的思路是,用动态规划的方式。F(i)表示含第i天能获取的最大收益。F(i) = max { F(i-1) , 第i天的股票价格 - 第i天以前的最低股票价格 }class Solution { public int maxProfit(int[] prices) { //动态规划解题,设每个序号的股价为p(i) //设第包括序号i之前的最大收益为F(i原创 2020-06-01 18:32:50 · 222 阅读 · 0 评论 -
【LeetCode】399. 除法求值 并查集
这道题目的解法是带权值的并查集。并查集可以看这篇文章的讲解:https://blog.csdn.net/niushuai666/article/details/6662911并查集由一个整数型的数组和两个函数构成。数组pre[]记录了每个点的前导点是什么,函数find是查找,join是合并解题思路:建立两个map,一个map存储上一级结点。一个map存储比值。首先不断构建查并集结构。如果两者根节点不一致,进行合并。然后输出最终的结果即可。public class Solution {..原创 2020-05-30 11:46:18 · 281 阅读 · 0 评论 -
【LeetCode】337. 打家劫舍 III
思路是:递归解题,rob(根节点)可以分成两种情况:一定有根节点,一定没有根节点。其中,一定有根节点的情况,说明一定没有根节点的两个儿子。这个方法是自上而下的,因而有许多重复的子问题。时间复杂度较高。public class Solution { public int rob(TreeNode root) { // 用递归的思路 if (root == null) return 0; int money = root.val; .原创 2020-05-28 15:36:01 · 132 阅读 · 0 评论 -
【LeetCode】347. 前 K 个高频元素
我的思路是建立一个Map,key存储数,value存储出现的次数。然后将获取,由entry构成的list,根据value值降序排列。然后获取前k个的key,就是结果。public class Solution { public int[] topKFrequent(int[] nums, int k) { HashMap<Integer, Integer> map = new HashMap<>(); for (int num : nums.原创 2020-05-28 13:44:43 · 122 阅读 · 0 评论 -
【LeetCode】739. 每日温度 (字节第四次面试的题目)(皮皮虾)
简单来说,就是找再过几天,温度超过今天。如果之后的温度都低于今天,置为0我的做法是直接按照题意来,时间效率上有点低。public class Solution { public int[] dailyTemperatures(int[] T) { // 就按照题意来吧 int[] res = new int[T.length]; for (int i = 0; i < T.length; i++) { // 遍历数.原创 2020-05-28 12:07:20 · 295 阅读 · 0 评论 -
【LeetCode】49. 字母异位词分组
我的思路是建立一个map,遍历字符串数组,将字符串数组转换成字符数组,排列,然后再转换成字符串。map的key是字符串。如果map的key中有这个字符串,我在value中添加这个字符串,没有的话,我创建一个新的List<String>。最后遍历map,将value整合成一个list,输出结果。public class Solution { public List<List<String>> groupAnagrams(String[] strs) { .原创 2020-05-28 09:40:44 · 144 阅读 · 0 评论 -
【LeetCode】215. 数组中的第K个最大元素
直接使用Arrays.sort API,复杂度为nlogn还可以更快。class Solution { public int findKthLargest(int[] nums, int k) { Arrays.sort(nums); return nums[nums.length - k]; }}手写快速排序但是手写快排的速度并没有赶上直接调用库函数…public class Solution { public int findK.原创 2020-05-26 14:31:19 · 176 阅读 · 0 评论 -
【LeetCode】11. 盛最多水的容器
我的思路是搞两层循环,一个遍历桶的左边沿,一个遍历桶的有边沿。然后获得这些遍历的最大值。速度有点慢。public class Solution { public int maxArea(int[] height) { int len = height.length; int res = 0; for (int i = 0; i < len - 1; i++) {// 遍历左边的边沿 for (int j = i +.原创 2020-05-26 12:51:35 · 171 阅读 · 0 评论 -
【LeetCode】236. 二叉树的最近公共祖先
我的思路是,先创建一个方法isParent,可以判读一个结点是不是另一个结点的父结点。怎么实现找到两个结点的最近父结点呢?从根节点开始,如果它的左或右子结点是两个结点的父结点,就接着递归。直到它的左或右子结点都不是这两个结点的父结点。那么就找到了最终的结果。能够成功运行,但是速度很慢,需要另寻他法。public class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode .原创 2020-05-26 11:46:46 · 119 阅读 · 0 评论 -
【LeetCode】406. 根据身高重建队列
我的直观思路是搜索回溯算法,加上剪枝。也就是dfs,深度优先遍历。但是最终的结果是超出时间限制,看来需要换一种耗时少的算法。public class Solution { public int[][] reconstructQueue(int[][] people) { // 用搜索回溯的方法来解题。 int len = people.length;// 一共有len个人 int count = 0; // 排序到第count个人 .原创 2020-05-26 10:06:22 · 194 阅读 · 0 评论