自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 树的非递归遍历

//下面代码会用到的树结构 /* 1 2 3 4 5 7 6 先序遍历: 1 2 4 6 5 3 7 中序遍历: 6 4 2 5 1 3 7 后序遍历: 6 4 5 2 7 3 1 */ 先序遍历 遍历思想:自己准备一个栈,先把头结点压入栈中,如果栈不等于空,那就进行循环,每次先弹出一个节点,打印出来,然后再判断右子树是否为空,不为空压入栈中,再判断左子树是否为空,不为空压入.

2021-10-22 16:22:27 438 1

原创 LeetCode142.环形链表

返回环形链表的第一个节点。 首先得是环形链表,这里我用的是快慢指针的解法,慢指针一次走一步,快指针一次走两步,当快慢指针相遇时,让快指针等于链表头,然后快慢指针都走一步,直到两个再次相遇就是环形链表的第一个节点,这是别人证明的结论,拿来用就行,代码如下: /** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) {

2021-10-16 15:59:37 67

原创 Leetcode160.链表相交

/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public ListNode getIntersectionNo.

2021-10-16 15:26:56 76

原创 堆排序(Java版)

堆(Heap)通常是一个可以被看做一颗完全二叉树的数组对象。 完全二叉树的一些定义: 左孩子等于父节点*2+1,例如父节点的索引是0,那么左孩子就是1 右孩子等于父节点*2+2,例如父节点的索引是0,那么右孩子就是2 父节点等于(孩子的索引-1)/2,例如孩子的索引是2,那么父节点就是0 堆分为两种,分别是大根堆和小根堆 大根堆:父节点的值大于或等于子节点的值;(图片是引用的) 小根堆:父节点的值小于或等于子节点的值;(图片是引用的) 堆操作 Insert:某个数现在处在index位

2021-10-04 11:32:30 147

原创 桶排序(基数版)

一个十进制数,每一位都是由0-9之间的数组成,生成10个桶,从个位数开始比较到最大位数,建立一个辅助数组,利用先进先出的原则出桶放在辅助数组(和原数组一样大)中,直到比较最大位数的出桶结束。 例子:013,021,011,052,062,100 第一趟进桶(个位数):0号桶 100 1号桶 021 011 2号桶 052 062 3号桶 013 第一趟辅助数组(从0号桶开始出桶,先进先出):100 021 011 052 062 013 第二趟进桶(十位数):0号桶 100 1号桶 011...

2021-10-04 11:24:15 93

原创 归并排序及扩展

引导:递归的方式求出数组的最大值 将数组二分,分到不能再分,然后进行比较,代码如下: public int getMax(int [] arr){ return process(arr,0, arr.length-1); } //递归的方式获得数组中的最大值,时间复杂度O(N) public static int process(int [] arr,int L,int R){ if (L == R){ return

2021-09-26 22:25:12 119

原创 简单排序及二分算法

下面是三种时间复杂度为O(N²)的排序算法:选择排序,冒泡排序,插入排序 选择排序算法思想:每次从i - 数组长度-1选出一个最小值,和 i 进行交换 这里的 i 指的是每次排序后数组的长度,比如第一次排序有序数组的长度为0,那么就是从0到数组长度-1这个范围内选出最小值,与0位置的值进行交换,代码如下: //选择排序:每次选出最小的放在索引i处,因为是原地操作,所以不需要返回值 //时间复杂度O(N²) public void xz(int [] arr){

2021-09-23 17:28:18 90

原创 LeetCode 36. 有效的数独

难度:中等 解题思路:根据题目给的条件一个一个判断,先判断行,再判断列,最后再判断3*3矩阵,唯一出乎我意料的是,时间上竟然超过了70%用户,因为我用了许多循环进行判断,代码如下: class Solution { public boolean isValidSudoku(char[][] board) { //数字 1-9 在每一行只能出现一次。 for (int i = 0; i < 9; i++) { ArrayList<

2021-09-17 23:43:28 54

原创 LeetCode 162. 寻找峰值

难度:中等 解题思路:第一个数比第二个大一定是峰值,最后一个比前一个大,一定是峰值,其他的数字就是比两边大的是峰值,时间复杂度O(n-1)代码如下: class Solution { public int findPeakElement(int[] nums) { if (nums.length == 1){ return 0; } if (nums.length == 2){ if (nums[

2021-09-15 21:25:11 42

原创 LeetCode 678. 有效的括号字符串

难度:中等 第一次中等题目时间击败100%的用户 解题思路: 以右括号为基准,先把右括号判断完,然后在看看有没有剩下的左括号,在进行左括号与*之间的比较,感觉这题算是一题比较简单的逻辑题,代码如下: class Solution { public boolean checkValidString(String s) { if (s.equals("")){ //如果是空字符串直接返回true return true;

2021-09-12 23:51:40 50

原创 LeetCode 1894. 找到需要补充粉笔的学生编号

难度:中等 感想:我感觉的这题主要难在优化,如果要只是为了解题,那么难度只有简单,几分钟不到就做完了,我看评论区有很多被溢出gank的,奇妙的是我没有被gank,今天又是暴力的一天,只能说暴力毫无时间复杂度可言,高的离谱 class Solution { public int chalkReplacer(int[] chalk, int k) { while (true){ for (int i = 0; i < chalk.length; i++

2021-09-10 17:14:05 60

原创 LeetCode 12. 整数转罗马数字

难度:中等 解题思路:和我之前做的罗马转整数一样,暴力就完事了,个人感觉难度应该是简单,上代码 class Solution { public String intToRoman(int num) { HashMap<Integer,String> map = new HashMap<>(); map.put(1,"I"); map.put(4,"IV"); map.put(5,"V");

2021-09-09 21:05:44 50

原创 Dijkstra的双栈算术表达式求值算法

题目描述:给定一个字符串数组,里面是算术表达式,例如:(1+((2+3)*(4*5))) String [] strs = {"(","1","+","(","(","2","+","3",")","*","(","4","*","5",")",")",")"}; 给出表达式最后的计算结果,代码如下: public Double Evaluate(String[] strs) { Stack<String> ops = new Stack<>();

2021-09-08 21:50:03 53

原创 LeetCode 66. 加一

难度:简单 解题思路:只需要考虑进位和999之类的特殊情况就可以,这一次算法的时间超过了100%的用户,代码如下: class Solution { public int[] plusOne(int[] digits) { for (int i = 1; i <= digits.length; i++) { if (digits[digits.length-i] == 9){ digits[digits.lengt

2021-09-07 20:45:51 46

原创 LeetCode 704. 二分查找

难度:简单 一个入门的算法,代码如下: class Solution { public int search(int[] nums, int target) { int h = 0; int w = nums.length-1; int min = (h+w)/2; while (true){ if (nums[min] == target){ return min;

2021-09-07 20:09:10 44

原创 LeetCode 136. 只出现一次的数字

难度:简单 解题思路:今天依旧是暴力解法,暴力解法的代码容易看懂,就不过多解释了,这题官方4行代码就搞定了,使用的是异或,代码阅读越难理解,上代码 class Solution { public int singleNumber(int[] nums) { int a =0; boolean flag = false; for (int i = 0; i < nums.length; i++) { for (int

2021-09-07 19:46:49 51

原创 LeetCode 14. 最长公共前缀

难度:简单 解题思路:将整个数组的元素都拿出来,利用切割进行比较前缀,暴力解法,代码如下: class Solution { public String longestCommonPrefix(String[] strs) { for (String s : strs) { if ("".equals(s)){ return ""; } } int i =

2021-09-06 13:13:59 61

原创 LeetCode 13. 罗马数字转整数

难度:简单 解题思路:题目提到会有6种特殊情况,将这6种情况考虑进去,就可以很容易得出答案,这次我的代码运行时间是7ms,官方的运行时间是6ms,代码相对来说有点多,上代码 class Solution { public int romanToInt(String s) { int sum = 0; HashMap<Character,Integer> map = new HashMap<>(); map.put('I',

2021-09-05 17:37:18 34

原创 LeetCode 7. 整数反转

难度:简单 解题思路:像这种题目,基本就是用余数和除数来进行整数的反转,该题唯一的坑就是溢出,我们可以用一个变量来保存结果,在每次循环结束判断是否溢出,代码如下: class Solution { public int reverse(int x) { int result = 0; while(x != 0) { int t = result; // 保存计算之前的结果 result = (result * 10

2021-09-04 16:02:09 45

原创 leetcode 26. 删除有序数组中的重复项

难度:简单 解题思路: 排序后的数组,相邻的元素是相等的,就说明重复了,题目要求在原地操作,我们可以设置两个指针,一个用来判断元素相等,一个用来替换,遍历数组,判断到不同元素,把他替换到替换指针的位置,替换指针往前走一位,话不多说,上代码 class Solution { public int removeDuplicates(int[] nums) { int j = 1; //用于判断 int x = 0; //用于替换和记录最终长度 .

2021-09-03 15:59:59 40

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除