![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数组
Ealiser
这个作者很懒,什么都没留下…
展开
-
LeetCode第309题 最佳买卖股票时机含冷冻期
算法动态规划核心思想1)做了几个动态方程的题,觉得第一步是先找当前有哪几种状态。在本题中,共分为三种状态:(1)不持有:有两种情况导致不持有①i-1天不持有股票;②i-1天有股票且当天出货(2)持有:①昨天持有股票;②今天买入前提是昨天没出货(3)不持有因为当天出货,此状态两个目的:满足(1)不持有状态下第二种情况;确保昨天没有出货。2)接着确定初始状态: dp[0][0] = 0; dp[0][1] = -1 * prices[0]; dp.原创 2022-05-03 11:22:47 · 252 阅读 · 0 评论 -
LeetCode第105题 从前序与中序遍历序列构造二叉树
算法分治算法核心思想可以根据前序遍历找到每一颗树的根节点,将中序遍历分为两个部分,分别定义左子树方法和右子树方法。代码class Solution { int num = 0; public TreeNode buildTree(int[] preorder, int[] inorder) { TreeNode root = new TreeNode(preorder[0]); int i = 0; for(;i < in.原创 2022-04-15 08:31:28 · 2635 阅读 · 0 评论 -
LeetCode第102题 二叉树的层序遍历
算法广度优先遍历核心思想代码class Solution { List<List<Integer>> res = new LinkedList<>(); public List<List<Integer>> levelOrder(TreeNode root) { if(root == null) return new LinkedList<>(); List<..原创 2022-04-11 16:00:59 · 922 阅读 · 0 评论 -
LeetCode第22题 括号生成
算法回溯法核心思想简单的回溯,这几天做了几个回溯的类型题,简单做个总结,不一定对,还需要验证:使用回溯的题目,基本和二叉树和图有关系,使用的方法很多事深度优先遍历。对于二叉树的题目做好画好一个二叉树,做好模拟,想好减枝的条件,操作即可。代码class Solution { List<String> res = new LinkedList<>(); public List<String> generateParenthesis(int n).原创 2022-04-07 14:15:29 · 1136 阅读 · 0 评论 -
LeetCode第200题 岛屿数量
算法深度优先搜索核心思想简单的深度优先搜索,每次搜索就发现一个岛屿。这个解法是岛屿题的通解题。代码class Solution { public int numIslands(char[][] grid) { int nums = 0; int m = grid.length; int n = grid[0].length; for(int i = 0;i < m;++i){ for(int .原创 2022-04-06 15:50:54 · 1194 阅读 · 0 评论 -
LeetCode第51题八皇后问题
算法回溯核心思想八皇后问题是回溯的经典问题。首先建议把模板备好,照着模板开始写。List<Value> result;void backtrack(路径,选择列表){if(满足结束条件){result.add(路径);return;}for(选择:选择列表){做选择;backtrack(路径,选择列表);撤销选择;}}此外,对于使用java做这个道题,需要考虑java的字符处理太复杂了,建议先使用数组,然后进行转换。另外U1S1,笔试碰到这种题大概率要GG,.原创 2022-04-05 16:07:21 · 1982 阅读 · 0 评论 -
LeetCode第46题 全排列
算法回溯算法核心思想这是做的第一道回溯算法题目。回溯的主要是通过穷举解决组合问题,这种思想非常适合处理面试的问题。因为此方法虽然占有大量的时间复杂度,但是却能很快给出解答。给出一个回溯法的万能公式List<Value> result;void backtrack(路径,选择列表){if(满足结束条件){result.add(路径);return;}for(选择:选择列表){做选择;backtrack(路径,选择列表);撤销选择;}}代码class So.原创 2022-04-04 16:39:02 · 736 阅读 · 0 评论 -
LeetCode第268题 丢失的数字
算法位运算 --> 异或核心思想异或专注于寻找缺少的数字或者出现一次的数,利用的是异或和。神奇,不知道原理。代码class Solution { public int missingNumber(int[] nums) { int xor = 0; int n = nums.length; for(int i = 0;i<n;i++){ xor ^= nums[i]; } .原创 2022-03-31 14:40:07 · 650 阅读 · 0 评论 -
LeetCode第367题 有效的完全平方数
算法二分查找核心思想简单的二分查找问题。还是注意范围问题代码class Solution { public boolean isPerfectSquare(int num) { if(num == 1) return true; int left = 1; int right = num; while(left <= right){ int mid = left + (right - left.原创 2022-03-31 12:45:03 · 526 阅读 · 0 评论 -
LeetCode第278题 第一个错误的版本
算法二分查找核心思想本文是很常见的寻找左边界的问题,直接往里套就可。值得说明的是二分查找求mid的方法,第一种方法存在溢出的问题,使用第一种方法要使用long类型数据,第二种方法不存在溢出的问题,可以直接用int类型。//第一种mid = (left+right)/2;//第二种mid = left+(right - left)/2代码public class Solution extends VersionControl { public int firstBadVe.原创 2022-03-31 10:58:38 · 466 阅读 · 0 评论 -
LeetCode第162题 寻找峰值暨二分总结(1)
算法二分查找核心思想二分查找的边界问题代码class Solution { public int findPeakElement(int[] nums) { if(nums.length == 1) return 0; if(nums.length == 2) return nums[0] > nums[1] ? 0:1; int left = 0; int right = nums.length - 1; .原创 2022-03-30 14:46:00 · 1157 阅读 · 0 评论 -
LeetCode第74题 搜索二维矩阵
算法二分查找核心思想将整个过程分为两个部分,第一个部分为判定在哪行,然后对当前行进行二分查找。代码class Solution { public boolean searchMatrix(int[][] matrix, int target) { int m = matrix.length; int n = matrix[0].length; int webM = -1; for(int i = 0; i < m;.原创 2022-03-29 14:20:33 · 347 阅读 · 0 评论 -
LeetCode第33题 搜索旋转排序数组
算法二分查找核心思想1)首先想到的是双指针,分别找到两个有序数列的起点,根据target与数字第一个数字对比,选择哪个指针移动。2)另外一个思路就是二分查找法。第一种效果更好。代码//方法一class Solution { public int search(int[] nums, int target) { if(nums.length == 1 && nums[0] == target) return 0; int first.原创 2022-03-29 13:54:49 · 1222 阅读 · 0 评论 -
LeetCode第35题 搜索插入位置
算法二分查找核心思想和二分查找,没有什么区别,注意当target大于mid的时候,更新位置加上left。代码class Solution { public int searchInsert(int[] nums, int target) { int left = 0; int right = nums.length - 1; while(left <= right){ int mid = left + (ri.原创 2022-03-28 13:02:33 · 371 阅读 · 0 评论 -
LeetCode第704题 二分查找
算法递归核心思想LeetCode给的解答是利用双指针进行解题,感觉也不是太二分,我选择二分到底,用的递归。代码class Solution { public int search(int[] nums, int target) { int len = nums.length; int i = len / 2; int result = -1; if(target == nums[i]) return .原创 2022-03-28 12:12:58 · 809 阅读 · 0 评论 -
LeetCode第56题 合并区间
算法贪心核心思想这道题类似于第452题 用最少数量的箭引爆气球,不断扩大自己的边界,如果无法扩大就保存至结果中。代码class Solution { public int[][] merge(int[][] intervals) { if(intervals.length == 1) return intervals; Arrays.sort(intervals, (o1, o2) -> Integer.compare(o1[0], o2[0])).原创 2022-03-26 12:48:57 · 875 阅读 · 0 评论 -
LeetCode第134题 加油站
算法贪心核心思想这道题第一反应就是计算差值,然后根据最大值进行选取起点。但是这里存在一个问题:选取最高点还是选取最长连续的起点,最后我选择暴力遍历。但是在每次油量为负数时,下次从当前位置的下一点开始。不然会超时。后来看了解析,发现大方向没有错误,问题出在了应该找最小值,如果最小值为小于0,则直接返回-1;不然就返回下一个位置。代码class Solution { public int canCompleteCircuit(int[] gas, int[] cost) { .原创 2022-03-26 10:29:37 · 855 阅读 · 0 评论 -
LeetCode第16题 最接近的三数之和
算法双指针核心思想我们需要实现a1+a2+a3无限逼近target,所以整个公式可以换为sum = a1+a2+a3-target。最终实现sum无限逼近于0。我选择固定a1-target,然后令一个指针从a2开始,另一个指针从尾开始,不断筛选最小值。代码class Solution { public int threeSumClosest(int[] nums, int target) { if(nums.length == 3) return nums[0]+num.原创 2022-03-25 16:01:07 · 1121 阅读 · 0 评论 -
LeetCode第122题 买卖股票的最佳时间II
算法贪心、动态规划核心思想只要挣钱我就买,两两做差,如果大于0,我就买,小于0我就留着。实际上总利润就是所有大于0的差值的和。代码class Solution { public int maxProfit(int[] prices) { int[] temp = new int[prices.length - 1]; int total = 0; for(int i = 1,j = 0;i < prices.length;i++,j.原创 2022-03-24 15:19:32 · 821 阅读 · 0 评论 -
LeetCode第376题 摆动序列
算法贪心也可以用动态规划核心思想我主要采用的是贪心的做法,对于任意开始,如果前一组数是>,那后一组只要是<即可,不是就换下一个数。代码class Solution { public int wiggleMaxLength(int[] nums) { if(nums.length == 1) return 1; int total = 0; int sign = 0; for(int i = 1;i < n.原创 2022-03-24 14:40:16 · 865 阅读 · 0 评论 -
LeetCode第452题 用最少数量的箭引爆气球
算法贪心核心思想整体思路就是不断修改射击的时间,在经过以起点为主的排序后,存在两个前提:前一组points0维必小于下一组points0维,以及同一组0维必小于1维。所以判定条件如下://存在射击窗口期[start,end]//对于数组[x1,y1],[x2,y2],存在如下情况x2 >= y1 -> 更新start=x2,end=y2;x1 >= x2 >= y1 -> 更新start = x2;x1 > x2 > y2 > y1 -&g.原创 2022-03-23 13:39:13 · 429 阅读 · 0 评论 -
LeetCode第860题 柠檬水找零
算法贪心核心思想用的sitch case,我以为会超出时间限制,没想到竟然过了。这道题我想有两个需要注意的点,记录不同零钱数目的数组长度为2即可,20的零钱没有意义;第二点是当使用的是20的零钱时,要优先使用10美刀,这里是贪心的使用。代码class Solution { public boolean lemonadeChange(int[] bills) { if(bills[0] == 10 || bills[0] == 20) return false; .原创 2022-03-22 15:31:59 · 85 阅读 · 0 评论 -
LeetCode第455题 分发饼干
算法贪心核心思想挺经典的贪心法吧,小孩子只能吃一块饼干注意一下就行了。PS:我还重写了一下排序算法代码class Solution { public static void swap(int[] a, int i, int j){ int temp; temp = a[i]; a[i] = a[j]; a[j] = temp; } public static int[] se.原创 2022-03-22 15:12:20 · 1672 阅读 · 0 评论 -
LeetCode第11题 盛最多水的容器
算法双指针、贪心核心思想这道题采用贪心的思想来做,贪心意为每一步都使当前利益最大化。最开始的想法是求出每一对之间的水量,然后从最大的水量的一组数中分别向左向右扩展,但是这个方法我没有通过数学证明出来。最终采用了别人的方法,同样是贪心,两个指针分别从头从尾开始,每次移动的是当前较小的板子,因为如果移动较大的板子存在变小的可能。这个代码也是写的精彩非常,给作者点赞代码class Solution { public int maxArea(int[] height) { .原创 2022-03-22 14:27:28 · 521 阅读 · 0 评论 -
LeetCode第977题 有序数组的平方
算法双指针核心思想这道题其实最简单的思路是直接平方以后,找个排序算法一排就可以,可以直接用快排。但是如果要求使用时间复杂度O(n)的算法,那就不能用排序算法,因为即便是快排,时间复杂度也要O(nlogn)。所以要利用非递减顺序这一条件。整个数组在平方后以第一个出现的正数为界,前半部分为逆序,后半部分为正序。可以令第一个指针指向正数前面的数字,第二个指针指向第一个正数,依次比较,存入新的数组中。如果为全正数数组,直接返回;全负数数组,颠倒顺序返回。代码class Solution { .原创 2022-03-21 18:49:40 · 384 阅读 · 0 评论 -
LeetCode面试第16题 部分排序
算法双指针核心思想不能用快排来做题,因为快排的指针无论从小到大还是从大到小所囊括的范围都存在一小部分多余的。采用双指针,分别从头从尾扫。头指针每次与当前最大的比较,碰到小的,便保存当前位置。代码class Solution { public int[] subSort(int[] array) { int max = Integer.MIN_VALUE; int min = Integer.MAX_VALUE; int len = ar.原创 2022-03-21 16:46:57 · 593 阅读 · 0 评论 -
LeetCode第75题 颜色分类
思想堆排序核心算法要求为使用常数空间,则符合要求的有冒泡排序、选择排序、插入排序、希尔排序、堆排序。本次采用堆排序。因为限制为2,计数排序应该效果也不错。代码class Solution { public static void swap(int[] a, int i, int j){ int temp; temp = a[i]; a[i] = a[j]; a[j] = temp; } public voi.原创 2022-03-21 13:48:35 · 622 阅读 · 0 评论 -
LeetCode 第88题合并两个有序数组
算法双指针核心思想两个指针分别指向一个数组,挨个比较,较小的进入新数组。这一部分和归并排序的合并部分方法是一样的。代码class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int[] temp = new int[nums1.length]; int i = 0,j = 0,k = 0; while(i != m &a.原创 2022-03-21 13:38:57 · 457 阅读 · 0 评论 -
JAVA实现数据结构7种排序算法代码
共总结了冒泡排序、选择排序、插入排序、快速排序、基数排序、归并排序、堆排序,全部使用Java实现。/** * @author Ealiser * @data 2022/3/18 - 9:49 * 排序集合 */public class Sort {// 公共方法:转换数组内两个数字的位置 public static void swap(int[] a, int i, int j){ int temp; temp = a[i];原创 2022-03-18 19:39:56 · 1566 阅读 · 0 评论 -
Leetcode第4题 寻找两个正序数组的中位数
使用的算法二分查找、递归核心思想首先需要考虑两个数组总长度为奇数还是偶数,本题将两种可能合二为一,当为奇数时,则计算两遍;当为偶数时,则计算相邻两个数字之和的平均数。 int left = (l1+l2+1) / 2; int right = (l1+l2+2) / 2;其次是二分查找法,对于总长度len,中位数应为k = len/2,那么对于每个数组的中位数应为k/2,考虑数组角标和位数的对应关系,则中位数的角标为k/2-1.此时需要考虑当角标超界限时,应该将角标定义为数.原创 2022-03-11 10:43:37 · 708 阅读 · 0 评论