![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
Ealiser
这个作者很懒,什么都没留下…
展开
-
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第144.94.145题 二叉树的三种遍历
算法回溯法、深度优先搜索核心思想三者在代码上的区别就是在哪里保存根的值。代码//先序遍历class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> res = new LinkedList<>(); if(root == null) return res; dfs(root,res); .原创 2022-04-11 14:05:23 · 990 阅读 · 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第137题 只出现一次的数字II
算法数学核心思想最开始想用桶排序的思路,但是JAVA数组的最长长度是31位,所以作罢。后来采用老办法,统计每个位置1的个数num & 1//确定最后一位是不是1res |= ans[31-i] % m;//复原位置代码class Solution { public int singleNumber(int[] nums) { int[] ans = new int[32]; for(int num:nums){ .原创 2022-04-02 15:31:44 · 1236 阅读 · 0 评论 -
LeetCode第338、191题 比特位计数 位1的个数
算法数学,逻辑与核心思想计算1比特数应该怎么做?Brian Kernighan 算法对于任意整数 xx,令 x=x & (x−1),该运算将 xx 的二进制表示的最后一个 11 变成 00。因此,对 xx 重复该操作,直到 xx 变成 00,则操作次数即为 xx 的「一比特数」。针对第二题,只需要将while条件变为!=0即可while x > 0{int nums = 0;x = x &(x-1);nums++;}代码class Solution .原创 2022-04-01 13:06:09 · 891 阅读 · 0 评论 -
LeetCode第231题 2的幂
算法位运算核心思想两种思路①一种是直接左移,这里需要注意即便使用long型结构保存数据,1的左移32位仍然是负数,因为1是32位保存的数据.②第二种方法为考虑2的倍数的特点,必定是只存在一个2,所以令n与(n-1)进行逻辑与即可。代码class Solution { public boolean isPowerOfTwo(int n) { int x = 0; long temp = 0; while(temp <= n){ .原创 2022-04-01 10:39:52 · 1011 阅读 · 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第611题 有效三角形的个数
算法贪心,二分查找核心思想排序完成后,遍历a+b,找出所有符合a+b>c的值。代码class Solution { public int triangleNumber(int[] nums) { if(nums.length < 3) return 0; Arrays.sort(nums); int res = 0; for(int i = 0;i < nums.length;++i){ .原创 2022-03-29 18:40:41 · 623 阅读 · 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第34题 在排序数组中查找元素的第一个和最后一个位置
算法递归、二分法核心思想最开始打算使用双指针的二分方法进行处理,结果发现没有办法解决找到第一个后,下一步界限的确定,压倒我这个思路的最后一根稻草是【1,1,1】,查找1.最后选择了递归法解决,觉得比较复杂的就是最后结果的迭代,我处理的不好。代码class Solution { public int[] search(int[] nums, int target,int left,int right){ System.out.println("left:"+left);.原创 2022-03-28 16:20:43 · 1113 阅读 · 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第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第55题 跳跃游戏
算法贪心核心思想根据当前数组a[i]的大小,对当前可以到达的位置(即小于i+a[i])进行遍历,选择一个最大的作为下一步,但是这里注意一点是如果当前的点即便是最大的,但所能到达的范围也在(i+a[i])的范围内。则应该选择另一个点。代码class Solution { public boolean canJump(int[] nums) { if(nums.length == 1) return true; if(nums[0] == 0) return.原创 2022-03-24 12:34:55 · 4299 阅读 · 0 评论 -
LeetCode第402题移掉K位数字
算法单调栈、贪心核心思想第一个数字a直接入栈,其他数字b与已经入栈的数字进行比较,如果b < a,则a出栈,直到①栈为空;②b >= a;③已经删除了k个数字.此外还存在三个特殊情况:①删除的数字少于k,则从末尾删除;②存在零,删掉;③序列为空,返回0.我采用的思路是贪心加递归,从前k个数中选择一个最小的(从这里开始错误,因为不保证在剩下的地方能找到其他小的),然后依次找其他数字。此这种方法还存在一个问题就是递归无法解决0的问题。代码class Solution { .原创 2022-03-23 21:48:33 · 226 阅读 · 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 评论 -
顺序栈和链栈的实现
//// Created by 孙博言 on 2020/5/29.//#include "stdio.h"#include "stdlib.h"#define maxSize 100typedef struct{ int data[maxSize]; int top;}SqStack;typedef struct{ int data; struct Lnode *next;}LNode;int main(){ //顺序栈基本函数 void原创 2020-05-29 22:18:46 · 299 阅读 · 0 评论 -
汉诺塔问题
说来惭愧,汉诺塔问题在大一就知道,毕业了才知道。。。。。研究生考试复试的时候,还很巧问到这个问题。汉诺塔是一个非常经典的印度问题,大意就是将按顺序摆放的盘子在不改变顺序的前提下,利用一个中间棍子,放到第三个棍子上,B站上有非常详细的讲解。这个问题使用函数的递归就可以,说来很简单,当时理解真是麻烦。//汉诺塔void hanoi(int n,char A,char B,char C){ void move(char,char); if(n == 1){ move('A'原创 2020-05-29 17:08:43 · 291 阅读 · 0 评论 -
C语言实现部分排序算法
//冒泡排序 升序int bubble(int a[10]){ int temp; for(int i =0;i<10;i++){ for(int j = 1;j<10-i;j++){ if(a[j-1] >a[j]){ temp = a[j-1]; a[j-1] = a[j]; a[j] = temp; }原创 2020-05-29 17:05:11 · 700 阅读 · 0 评论 -
链表实现
单链表实现//单链表定义typedef struct { int data; struct LNode *next;}LNode;//链表基本操作 LNode* CreateLNode(int data); LNode* CreateList(int num); LNode* ListInsert(LNode* head,int index,int data); LNode* DeleteList(LNode* head,int index);原创 2020-05-28 14:39:11 · 158 阅读 · 0 评论 -
C语言实现顺序表的基本操作
实现了使用C语言完成顺序表的插入,排序(冒泡排序),删除。#define maxSize 100//顺序表定义typedef struct { int data[maxSize]; int length;}Sqlist;int main(){ //顺序表基本操作 void CreatSqlist(Sqlist *L); void OutputSqlist(Sqlist *L); void insertElem(Sqlist *L,int x);\原创 2020-05-26 11:45:31 · 792 阅读 · 1 评论