10 2021 档案
摘要:202、快乐数 基本思想: 题目是中说如果平方和变不到1的话可能会无限循环 说明求和过程中,和 会重复出现 判断一个元素是否出现在集合里的时候,就要考虑哈希表 具体实现: 只要record中要加入的数重复出现一次就退出循环,得出不是快乐数的结论 代码: class Solution { public
阅读全文
摘要:28.strStr() 基本思想: KMP算法 具体实现: 要在文本串:aabaabaafa 中查找是否出现过一个模式串:aabaaf。 A 计算前缀表,得到next数组 本题用-1的方式实现 前缀表是下标i之前(包括i)的字符串,有多大长度的相同前缀后缀 next[i]表示i(包括i)之前最长相等
阅读全文
摘要:剑指offer05、替换空格 具体实现: 使用StringBuilder类,可以改变这个字符串对象的字符序列 class Solution { public String replaceSpace(String s) { StringBuilder res = new StringBuilder()
阅读全文
摘要:968、监控二叉树 基本思想: 贪心 具体实现: 从下往上看, 局部最优:让叶子节点的父节点安摄像头,所用摄像头最少 整体最优:全部摄像头数量所用最少 确定遍历顺序:后序遍历 节点的三种状态用三个数字表示: 0.本节点无覆盖 1.本节点有摄像头 2.本节点有覆盖 空节点的状态是有覆盖 递归终止条件:
阅读全文
摘要:738、单调递增的数组 基本思想: 贪心 具体实现: 基本数据类型转换为字符串类型: 1、将基本数据类型与空字符串(" ")连接(+)即可获得其所对应的字符串 2、调用String 类中的valueOf()方法返回相应字符串 3、使用包装类的toString()方法 int hh = 123; St
阅读全文
摘要:763、划分字母区间 基本思想: 贪心 具体实现: 1.统计每一个字符最后出现的位置,记录到edge数组中 2.用i从头遍历字符,idx记录这些不同的字符更靠后的最后出现的位置 比如图中a最后出现的位置是8,b最后出现的位置是5,idx记录8 分割点就是i == idx时,i的值 代码: class
阅读全文
摘要:452、用最少量的箭引爆气球 基本思想: 贪心 具体实现: 局部最优:当气球出现重叠,射,所用弓箭最少 全局最优:把所有气球射爆 1.为了让气球更好的重叠,需要对气球数组进行排序 按照起始位置进行排序,从前向后遍历数组,靠左尽可能让气球重复 2.气球重叠后,重叠气球中右边边界的最小值之前的区间需要一
阅读全文
摘要:860、柠檬水找零 基本思想: 贪心算法 具体实现: 三种情况: 1.给了5块,直接收下 2.给了10块,账单少一个5块,加一个10块 3.给了20块,优先少一个10块和一个5块,如果不够,再消耗3个15块 代码: class Solution { public boolean lemonadeCh
阅读全文
摘要:135、分发糖果 基本思想: 贪心算法 具体实现: 确定一个维度再去确定另一个维度 A确定右边评分大于左边评分(从前向后遍历),和自己的左边孩子比 局部最优:只要右边评分比左边大,右边的孩子就多一个糖果 全局最优:相邻的孩子中,评分高的右孩子获得比左孩子更多的糖果 如果ratings[i] > ra
阅读全文
摘要:134、加油站 基本思想: 贪心算法 具体实现: 首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。 每个加油站的剩余量rest[i]为gas[i] - cost[i] i从0开始累加rest[i],和记为curSum,一旦c
阅读全文
摘要:1005.K次取反后最大化的数组和 基本思想: 贪心算法 具体实现: 局部最优:让绝对值大的负数变为正数 整体最优:整个数组和达到最大 局部最优:让绝对值小的正数变为负数 整体最优:整个数组和达到最大 1.将数组按照绝对值大小从大到小排序 2.遍历数组,遇到负数将其变为正数,同时k-- 3.k还大于
阅读全文
摘要:122、买卖股票的最佳时机II 基本思想: 贪心算法 具体实现: 局部最优:收集每天的正利润 全局最优:求得最大利润 代码: class Solution { public int maxProfit(int[] prices) { int result = 0; for (int i = 1; i
阅读全文
摘要:53、最大子序和 基本思想: 贪心算法 具体实现: 1.遍历nums,用count累积子序和 2.count加上nums[i]以后,count变为负数的话 从nums[i+1]开始从0累积count 3.result记录最大子序和 代码: class Solution { public int ma
阅读全文
摘要:376、摆动序列 基本思想: 贪心算法 具体实现: preDiff存放上一次的差值 curDiff存放当前的差值 只要一正一负,执行count + + 但是preDiff初始化为0,不管怎样比都不会出现一正一负, 所以比较条件为 if ((curDiff > 0 && preDiff <= 0) |
阅读全文
摘要:455、分发饼干 基本思想: 贪心算法 具体实现: A 优先考虑胃口,先喂饱大胃口 大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子,那么就应该优先满足胃口大的。 1.先将饼干数组和小孩数组排序 2.从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩 B 优先考虑饼干,小饼干先喂
阅读全文
摘要:51.N皇后 基本思想: 回溯算法 基本思想: 代码随想录抄的 n皇后就是普通组合问题 递归深度就是row控制棋盘的⾏,也就是二维矩阵的高 每⼀层⾥for循环的col控制棋盘的列,⼀⾏⼀列,确定了放置皇后的位置 1.递归参数:二维数组result,棋盘大小n,记录遍历到第几层的row 2.递归终止条
阅读全文
摘要:131、分割回文串 基本思想: 回溯算法 具体实现: 1.递归终止条件 在代码中,startIndex充当分割线,递归参数需要传入startIndex,表示下一轮递归遍历的起始位置。 2.单层搜索的逻辑 在for (int i = startIndex; i < s.length(); i++)循环
阅读全文
摘要:17、电话号码的字母组合 基本思路: 回溯 具体实现: 1、字母和数字的映射 2、 (1)递归参数 num记录遍历输入数字到哪一位 (2)递归终止条件 num==输入的数字个数(digits.length) (3)单层遍历逻辑 不是求一个集合中的组合,而是求不同集合中的组合 代码: class So
阅读全文
摘要:216、组合总和III 基本思想: 回溯法 具体实现: 剪枝优化: 1.元素总和大于目标值,在递归终止的地方剪枝 2.和77题思路一样,for循环的范围剪枝 代码: class Solution { List<List<Integer>> result = new ArrayList<>(); Li
阅读全文
摘要:242、有效的字母异位词 基本思想: 哈希表 数组是一个简单哈希表 具体实现: 1、定义一个大小为26的数组record 2、record记录字符串s里字符出现的次数 3、需要把字符映射到数组也就是哈希表的索引上 字符a到字符z的ASCII是26个连续的数值 字符a映射到索引0,字符z映射到索引25
阅读全文
摘要:344、反转字符串 基本思想: 双指针中的左右指针 具体实现: 代码: class Solution { public void reverseString(char[] s) { for (int i = 0, j = s.length - 1; i < j; i++, j--){ char te
阅读全文
摘要:面试题02.07 链表相交 1、基本思想: 根据快慢准则,走的快的一定会追上走的慢的。 这道题中,走的链表短,那么指针走完短的链表以后就去走长的链表,可以理解为走得快的指针 只要其中一个链表走完了,就去走另一条链表。如果有交点,他们一定会相遇 1、代码: public class Solution
阅读全文
摘要:19、删除链表中的倒数第N个节点 具体实现: 1、定义虚拟节点 2、定义fast,slow指针,初始指向虚拟头结点 3、让slow和fast相隔n个节点 也就是让fast先走n+1步 4、让slow和fast同时移动,直到fast指向null 此时slow就指向要删除的节点的前一个节点 5、进行删除
阅读全文
摘要:看的代码随想录的过程 24、两两交换链表中的节点 具体实现: 1、设置虚拟头结点指向头结点,不容易乱 2、画图看指针 初始时,cur指向虚拟头结点 代码: class Solution { public ListNode swapPairs(ListNode head) { ListNode dum
阅读全文
摘要:707、设计链表 具体实现: 1.使用单向链表 删除链表节点: 添加链表节点: 2.使用双向链表 删除链表节点: 添加链表节点: 代码: 单向链表 class ListNode{//单向链表 int val; ListNode next; ListNode(){} ListNode(int val)
阅读全文
摘要:203、移除链表元素 具体实现: 如果头结点是要删除的元素选择两种方式 1、直接使用原来的链表进行删除操作 2、设置一个虚拟头结点再进行删除操作 代码: 1、不设置虚拟结点 class Solution { public ListNode removeElements(ListNode head,
阅读全文
摘要:59、螺旋矩阵II 基本思想: 循环结构 具体实现: 模拟顺时针画矩阵的过程: 填充上行从左到右 填充右列从上到下 填充下行从右到左 填充左列从下到上 注意左闭右开 这里每一种颜色,代表一条边,遍历的长度, 观察每一个拐角处的处理规则,拐角处让给新的一条边来继续画。 坚持每条边左闭右开的原则。 代码
阅读全文
摘要:209、长度最小的子数组 基本思想: 滑动窗口 具体实现: 1.窗口内是什么? 窗口内是窗口起始位置和窗口结束位置框住的一段数组。 2.窗口的起始位置如何移动? 如果当前窗口的值>=s,窗口要缩小,就是起始位置向后移。 3.窗口的结束位置如何移动? 如果当前窗口的值<s,窗口要扩大,就是结束位置向后
阅读全文
摘要:977、有序数组的平方 基本思想: 双指针法 左右指针 具体实现: 1、数组是有序的,但是负数平方后可能会变大 2、数组平方后的最大值在数组的最右端或者最左端 3、left指向数组起始位置,right指向数组终止位置 4、定义一个和原始数组一样大的新数组result 5、定义一个指针指向result
阅读全文
摘要:27、移除元素 基本思想: 数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖 双指针法(快慢指针) 具体实现: 代码: class Solution { public int removeElement(int[] nums, int val) { int fastIndex
阅读全文
摘要:看的代码随想录的解析 236、二叉树的最近公共祖先 基本思想: 自底向上查找,就可以找到公共祖先 回溯就是自底向上 后序遍历是天然的回溯过程,最先处理的一定是叶子节点 具体实现: 找到一个节点,左子树出现节点p,右子树出现节点q(反过来也行),那么该节点就是节点p和q的最近公共祖先。 递归三步: 1
阅读全文
摘要:222.完全二叉树的节点个数 基本思想: 递归 具体实现: 普通二叉树求节点个数 1.递归参数以及返回值 参数:根节点 返回值:以该节点为根节点的二叉树的节点数量 2.递归终止条件 遍历到空节点的话,返回0,表明节点数为0 3.单层递归的逻辑 先求左子树节点数量,再求右子树节点数量,最后取总再加1(
阅读全文
浙公网安备 33010602011771号