算法
文章平均质量分 62
刷题总结
奇怪的玩家aaa
这个作者很懒,什么都没留下…
展开
-
字母异位词——将数组当作哈希表用
字母异位词1.有效的字母异位词2.赎金信3.字母异位词分组4.找到字符串中所有字母异位词1.有效的字母异位词给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。有效的字母异位词思路:1.创建一个大小为26的数组,用来记录每个小写字母出现的次数2.分别收集两个字符串中的字母3.看数组是否为0class Solution { public boolean isAna原创 2022-01-21 23:28:37 · 455 阅读 · 0 评论 -
数组基本方法的总结
数组基本方法的总结1.数组的优缺点1.1 优点1.2缺点2.数组使用的基本方法2.1 两数之和2.2 删除有序数组中的重复项2.3 移除元素1.数组的优缺点1.1 优点1.按照索引查询元素快。2.能储存大量数据。3.访问数组方便。1.2缺点1.根据内容查找元素慢。2.数组大小一经确定不能改变,不利于动态存储。3.增加,删除元素效率慢。4.未封装任何方法,所有操作都需要用户自己定义。2.数组使用的基本方法2.1 两数之和leetcode:两数之和思路:暴力解法(以后学到更原创 2021-12-23 22:55:14 · 621 阅读 · 0 评论 -
链表复习(单链表)
链表复习(主要是单链表)1.链表的概念2.链表的实现2.1 节点封装类2.2 Link类3.实例3.1 LeetCode 2 :两数相加3.2 LeetCode 19 :删除链表的倒数第n个节点1.链表的概念数据域:存储元素信息的空间(可以是数组)。指针域:数据域的后继位置为指针域。用于存放指针。指针/链:指针用于节点之间的联系。节点:数据域和指针域共同组成节点。头节点:头结点是为了操作的统一与方便而设立的,放在第一个元素结点之前,其数据域一般无意义。2.链表的实现2.1 节点封装原创 2021-12-19 17:10:08 · 616 阅读 · 0 评论 -
链表的反转
链表的反转1.反转链表2.反转链表 II3.回文链表1.反转链表给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。反转链表方法1:双指针/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val;原创 2022-01-17 22:22:54 · 825 阅读 · 0 评论 -
多个数字之和
多个数字之和1.两数之和2.四数相加3.三数之和4.四数之和1.两数之和两数之和思路:本题使用hashmap,因为题目要求返回的是下标,我们需要同时存放值和下标。class Solution { public int[] twoSum(int[] nums, int target) { int[] ans =new int[2]; if(nums.length==0) return ans; //因为要存放key,val原创 2022-01-27 23:00:19 · 411 阅读 · 0 评论 -
链表的相关方法
链表的相关方法1.虚拟头节点的设置2.设计链表1.虚拟头节点的设置在链表问题中,我们直接控制节点往往不好操作,往往需要设置一个虚拟头节点来模拟操作。 ListNode dummy = new ListNode(-1,head);//连接两个链表,且当前链表头值为-1 ListNode pre =dummy;//指针指向dummy 移除链表元素class Solution { public ListNode removeElements(ListNode原创 2022-01-20 13:38:45 · 1061 阅读 · 0 评论 -
数组移除元素(快慢指针)
数组移除元素(快慢指针)1.移除元素2.删除排序数组中的重复项3.移动04.比较含退格的字符串5.有序数组的平方1.移除元素移除元素暴力解法class Solution { /* * 暴力解法:使用两层for循环,第一层循环遍历数组,第二层循环更新数组 */ public int removeElement(int[] nums, int val) { int len = nums.length; for(int i =0;i<原创 2022-01-07 21:06:07 · 970 阅读 · 0 评论 -
螺旋矩阵总结
螺旋矩阵总结1.螺旋矩阵2.例题2.1 螺旋矩阵 II2.2 螺旋矩阵1.螺旋矩阵总体思路:坚持循环不变量原则,同二分法。因为在循环中,有许多边界条件,一定要按固定的规则来遍历。2.例题2.1 螺旋矩阵 II注意:上层和右层的边界条件,本人第一次就没有注意到这个细节,导致改了半天。偏移量这一值的设定。螺旋矩阵class Solution { //我们严格按照左闭又开的原则进行分组 //上层:从左向右 //右层:从上到下 //下层:从右向左 /原创 2022-01-11 16:42:04 · 561 阅读 · 0 评论 -
二分法的思路总结
二分法的思路总结1. 二分法的使用前提2. 二分法的两种写法3.实例3.1 [二分查找](https://leetcode-cn.com/problems/binary-search/)3.2 搜索插入位置3.3在排序数组中查找元素的第一个和最后一个位置3.4 开根3.5有效的完全平方数1. 二分法的使用前提1.数组是有序数组2.数组的元素不重复,因为一旦又重复元素,使用二分法返回元素的下标可能不是唯一的3.查找元素2. 二分法的两种写法第一种:左闭右闭[left,right]1.in原创 2022-01-06 18:24:06 · 758 阅读 · 0 评论 -
滑动窗口小结
滑动窗口小结1.滑动窗口的思想2. 滑动窗口相关例题2.1 长度最小的子数组2.21.滑动窗口的思想所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们想要的结果。这是数组操作中的一个重要的方法。2. 滑动窗口相关例题2.1 长度最小的子数组这道例题的核心就在于通过双指针不断调节窗口的起始位置长度最小的子数组class Solution { //移动窗口:1.两个指针 //2.核心思路:在于调整滑动窗口起始的位置 public int minSu原创 2022-01-11 14:08:18 · 145 阅读 · 0 评论 -
判断元素是否出现在集合——哈希法
哈希法1.查找共用字符2.两个数组的交集3.两个数组的交集 II4.快乐数1.查找共用字符查找共用字符思路:1.先统计第一个字符串中字符的数量2.然后统计除第一个字符串中字符的数量,并且与第一个字符串相比较,取最小值。3.倘若值不为0,则输出该字符,说明该字符就是公用字符.class Solution { public List<String> commonChars(String[] words) { List<String> ans =原创 2022-01-25 21:31:00 · 827 阅读 · 0 评论 -
二叉树的翻转和对称
1.翻转二叉树翻转二叉树思路:迭代,可以继续套用模板,只需要一个翻转操作。模板/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNod原创 2022-02-19 22:47:47 · 252 阅读 · 0 评论 -
二叉树的层序遍历
二叉树的层序遍历1.层序遍历2.实例2.1二叉树的层序遍历2.2 二叉树的层序遍历 II2.3 二叉树的右视图2.4 二叉树的层平均值1.层序遍历层序遍历一个二叉树。就是从左到右一层一层的区遍历二叉树。为了实现层序遍历,我们需要借助一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而栈先进后出适合模拟深度优先遍历也就是递归的逻辑。2.实例2.1二叉树的层序遍历二叉树的层序遍历思路:1.创建队列用来存储节点,创建list集合用来存储结果2.逐层记录结果即可。/**原创 2022-02-16 18:03:55 · 10319 阅读 · 0 评论 -
反转字符串总结
反转字符串总结1.反转字符串2.反转字符串 II3.替换空格4.翻转字符串里的单词5.左旋转字符串1.反转字符串反转字符串这里是我们接触到的第一道反转字符串的例题我们可以使用双指针来完成首位的反转注意注意的是,这类题可能需要StringBulider这个容器class Solution { public void reverseString(char[] s) { int left=0; int right =s.length-1;原创 2022-02-02 20:16:21 · 975 阅读 · 0 评论 -
栈和队列小结
栈和队列小结1.用栈实现队列1.用栈实现队列用栈实现队列本题思路:题目的要求是用栈实现队列。那么我们可以创建两个栈来模拟,一个输入栈,一个输出栈。输入栈用来入队,输出栈用来出队列。当我们出队列时,如果输入栈不为空且输出栈为空,把输入栈的元素全部放入输出栈中,这样我们就可以保证出队的顺序是正确的。class MyQueue { Stack<Integer> stack1; Stack<Integer> stack2; public MyQueue原创 2022-02-10 12:03:59 · 6454 阅读 · 0 评论 -
二叉树的路径问题
二叉树的路径问题1.二叉树的所有路径1.二叉树的所有路径二叉树的所有路径递归+回溯/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeN原创 2022-02-25 13:10:41 · 305 阅读 · 0 评论 -
二叉树的对称问题
二叉树的对称问题1. 对称二叉树2.相同的树3.另一棵树的子树1. 对称二叉树对称二叉树思路:1.先将根节点的左右节点入队。2.出队,比较两个节点的值是否相等3.若相等,则当前左节点的左节点入队,当前右节点的右节点入队,当前左节点的右节点入队,当前右节点的左节点入队。若不相等,返回false。4.注意:当节点为空时,跳出此次循环。。。。。。/** * Definition for a binary tree node. * public class TreeNode { *原创 2022-02-24 21:14:39 · 411 阅读 · 0 评论 -
二叉树的前中后序遍历
二叉树的前中后序遍历1.递归的三要素2.二叉树的前序遍历3.二叉树的后序遍历4.二叉树的中序遍历1.递归的三要素确定递归的参数和返回值:确定哪些参数是递归过程中需要处理的,那么就在递归函数里加上整个参数。并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。确定终止条件:写完了递归算法,运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统栈就会溢出。确定单层递归的逻辑:确定每一次递归需要处理的原创 2022-02-16 11:47:26 · 429 阅读 · 0 评论 -
回溯-子集问题
回溯-子集问题1. 子集2.子集 II3.递增子序列一些子集问题要记录树上的所有节点,因此终止条件可加可不加1. 子集子集该题和排列问题基本相似,本题需要收集所有的结果。class Solution { List<List<Integer>> result = new ArrayList<>(); LinkedList<Integer> path = new LinkedList<>(); public原创 2022-03-09 11:20:52 · 190 阅读 · 0 评论 -
回溯之分割问题
回溯之分割问题1.分割回文串2.复原 IP 地址1.分割回文串分割回文串判断是否回文过程中,startIndex就是分割符,判断字串的范围就是[startIndex,i]class Solution { List<List<String>> res = new ArrayList<>(); Deque<String> deque = new LinkedList<>(); public List<List原创 2022-03-07 21:38:54 · 97 阅读 · 0 评论 -
区间问题(贪心算法)
区间问题(贪心算法)1.跳跃游戏2.跳跃游戏 II1.跳跃游戏跳跃游戏class Solution { public boolean canJump(int[] nums) { int cover = 0;//覆盖长度 //在覆盖范围内更新等最大覆盖范围 for(int i=0;i<=cover;i++){ //更新覆盖长度 cover = Math.max(cover,i+nums[i]原创 2022-03-18 20:26:02 · 390 阅读 · 0 评论 -
组合相关问题
组合相关问题11.组合2.组合总和 III3.电话号码的字母组合1.组合组合本题可以说是组合的经典问题了。一般该题我们使用回溯算法,结合树型结构完成根据上图再结合代码class Solution { LinkedList<Integer> path = new LinkedList<>();//存放组合 List<List<Integer>> res = new ArrayList<>();//输出结果 p原创 2022-03-06 00:09:51 · 195 阅读 · 0 评论 -
贪心算法一
贪心算法一1.分发饼干2. 柠檬水找零1.分发饼干分发饼干1.先排序2.遍历饼干的尺寸,找到合适的胃口时,表示胃口的指针加一class Solution { public int findContentChildren(int[] g, int[] s) { int sum = 0; int start = 0;//孩子胃口遍历的指针 //按照从小到大顺序排序 Arrays.sort(g); Array原创 2022-03-17 15:25:37 · 128 阅读 · 0 评论 -
贪心算法之序列问题
贪心算法之序列问题1.摆动序列2.单调递增的数字1.摆动序列摆动序列[2,5,7]我们默认认为[2,2,5,7],因此我们记录答案的时候默认从第一个开始。我们还需要设置当前差和前一个差值class Solution { public int wiggleMaxLength(int[] nums) { if(nums.length<=1){ return nums.length; } /* *原创 2022-03-18 21:14:08 · 439 阅读 · 0 评论 -
贪心解决股票问题
贪心解决股票问题1.买卖股票的最佳时机 II2. 买卖股票的最佳时机含手续费1.买卖股票的最佳时机 II买卖股票的最佳时机 II我们只需要记录后一个比前一个值大的即可class Solution { /** 贪心算法:[7,1,5,3,6,4] 利润:[-6,4,-2,3,-2] 我们只收集利润中的正数 */ public int maxProfit(int[] prices) { int sum = 0; fo原创 2022-03-18 20:58:09 · 468 阅读 · 0 评论 -
回溯——排列问题
回溯——排列问题1.全排列2.全排列 II1.全排列全排列class Solution { List<List<Integer>> res = new ArrayList<>(); LinkedList<Integer> path = new LinkedList<>(); boolean[] used;//标记已经选择的元素 public List<List<Integer>> p原创 2022-03-10 22:13:55 · 113 阅读 · 0 评论