![](https://img-blog.csdnimg.cn/20190927151026427.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法题
算法
weixin_45663946
这个作者很懒,什么都没留下…
展开
-
翻转二叉树
问题描述: 翻转一棵二叉树思路: 递归翻转,主要是swap(类似于交换两个变量)AC:struct TreeNode* invertTree(struct TreeNode* root){ if(root == NULL) { return NULL; } //swap struct TreeNode* temp = root->left; root->left = root->right; root-&g原创 2021-05-11 23:13:05 · 51 阅读 · 0 评论 -
汉诺塔-解决你一直想不通的递归
汉诺塔问题问题描述: 存在A、B、C三根石柱。起始状态结尾状态分析思路:当n=1(即盘子数为1的情况),直接移动到C即可。当n=2,编号从上到下为1号盘子,2号盘子。1->B,2->C,1->C。第一个圆盘,从A到B。第二个圆盘,从A到C。第一个圆盘,从B到C。当n=3,编号从上到下为1号盘子,2号盘子,3号盘子。第一个圆盘,从A到C。第二个圆盘,从A到B。第一个圆盘,从C到B。第三个圆盘,从A到C。第一个圆盘,从B到A。第二个圆盘,从B到C。第一个圆盘原创 2020-12-19 22:47:38 · 129 阅读 · 1 评论 -
每日一题:143. 重排链表
题目概述:给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。思路:用列表实现随机存取代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} *原创 2020-10-20 14:47:20 · 217 阅读 · 0 评论 -
填充每个节点的下一个右侧节点指针(层次遍历解决)
题目描述:给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。/*// Definition for a Node.class Node原创 2020-10-15 09:06:17 · 49 阅读 · 0 评论 -
两两交换链表中的结点
题目描述:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。图片讲解:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } *原创 2020-10-13 15:03:50 · 101 阅读 · 1 评论 -
二叉搜索树的最小绝对差
给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。思路: 首先这是一个二叉搜索树,满足左<根<右,中序遍历得到一个递增的数组。 相邻两数的差值的最小值就是答案。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(i原创 2020-10-12 08:51:31 · 74 阅读 · 0 评论 -
1374. 生成每种字符都是奇数个的字符串
以后刷leetcode计划用多种语言来写 在练题的同时 也去掌握多门语言 了解各个语言的特性题目描述:给你一个整数 n,请你返回一个含 n 个字符的字符串,其中每种字符在该字符串中都恰好出现 奇数次 。返回的字符串必须只含小写英文字母。如果存在多个满足题目要求的字符串,则返回其中任意一个即可。javaclass Solution { public String generateTheString(int n) { return "a".repeat(n-1)原创 2020-10-11 20:48:52 · 102 阅读 · 1 评论 -
背包问题(用到动态规划)
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。dp[i][j] = dp[i - 1][j] or dp[i - 1][j - nums[i]]0到i中一些数和为j0到i-1中一些数和为j0到i-1中一些数和为j - nums[i] (此时选择nums[i] 和也就是j了)目的还是和为j背包问题:列一个二维表格来理解dp[1][6]能为true的关键是因为0到i-1中一些数和为j - nums[i] (此时选择nums[i] 和也原创 2020-10-11 10:49:35 · 53 阅读 · 0 评论 -
环形链表 找进环的结点
题目概述:给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。解题思路:(快慢指针)f为快指针所走的步数s为慢指针所走的步数a为入环前所有的结点数b为环里面所有的结点数n为所走的圈数第一次相遇(1)f=2s(2)f=s+nb由(1)(2)得 f=2nbs=nb假设我们从开始统计步数k则k=a+nb时走到入环的第一个结点看上面 s=nb 在这个时间点如果s再走a步刚好到入环的第一个结点问题转变为求a把f指针指向头结点 然后让f和s一起走原创 2020-10-10 09:07:01 · 67 阅读 · 0 评论 -
数组链表对比,双指针思路,找中间元素(快慢指针),环型链表问题
数组: 连续存储 每个元素占用相同空间 优点:读取方便,根据偏移实现快速的随机读写 缺点:增加 删除元素慢 时间复杂度为O(n)链表: 若干结点组成 结点由数据域和指针域构成 数据域可以使int string 等等 头结点作用:(处理统一) 1、防止单链表是空的。 2、为了方便单链表的特殊操作,插入在表头或者删除第一个 结点.这样就保持了单链表操作的统一性。双指针思路:问题:找到链表中倒数第k个元素p,q两个指针 step1:先让p沿着next走k次(此时p指向k原创 2020-10-09 15:19:34 · 115 阅读 · 0 评论 -
重复的子字符串
题目简述:给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。解题思路:一个字符串通过移位最后可以变为它本身在移位变为它本身(走完一圈后)这个过程中,若存在是由一个子串重复构成的那么它绝对会有一个状态是回归本身的时候(与本身字符串相等的时候)我们把研究的那个字符串再写一个出来,两个连接在一起,那么所新形成的字符串就包含所有状态我们把新字符串掐头去尾 看它是否包含原字符串class Solution { pub原创 2020-10-08 20:19:03 · 97 阅读 · 0 评论 -
字符串压缩(小知识点)
当对字符串进行修改的时候需要使用 StringBuffer 和 StringBuilder 类。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。由于 StringBuilder 相较于 StringBuffer 有速度优势,原创 2020-10-08 15:39:27 · 924 阅读 · 1 评论 -
字符串应用(替换所有的问号)
给你一个仅包含小写英文字母和 '?' 字符的字符串 s,请你将所有的 '?' 转换为若干小写字母,使最终的字符串不包含任何 连续重复 的字符。注意:你 不能 修改非 '?' 字符。题目测试用例保证 除 '?' 字符 之外,不存在连续重复的字符。在完成所有转换(可能无需转换)后返回最终的字符串。如果有多个解决方案,请返回其中任何一个。可以证明,在给定的约束条件下,答案总是存在的。示例1:输入:s = "?zs"输出:"azs"解释:该示例共有 25 种解决方案,从 "azs" 到原创 2020-10-08 10:18:53 · 786 阅读 · 0 评论 -
字符串应用(计算器)
给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格。整数除法仅保留整数部分。示例:输入: "3+2*2"输出: 7答案://思路1.碰到数字直接入栈2.碰到空格,直接下一步3.碰到 + - * / 碰到+ 下一个数字直接入栈 碰到- -num入栈(num=-num) 碰到* 弹出上个数字相乘后入栈(num = stack.pop() * num) 碰到/ nu原创 2020-10-07 14:58:40 · 234 阅读 · 0 评论 -
旋转数组的最小数字
题目概述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。分析:(图来自力扣)旋转之后数值的分布如图用二分查找来实现比较high与pivot若high大于piovt,则看图piovt只可能出现在最小值右半部分,二分查找的范围必须是包含所要找的目标的,所以high值变为pivot若high小于piovt,则看图piovt原创 2020-09-17 21:18:10 · 48 阅读 · 0 评论 -
斐波那契数列类型题
前言:在leetcode上刷剑指offe时,接连碰到两道有关斐波那契数列的问题。解决思路:首先你要知道这种题的公式一般都是f(n)=f(n-1)+f(n-2)即第n项等于前两项的和用这个公式的时候需要我们第一项和第二项已知即f(1),f(2)直接摆题第一题:写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.第二题原创 2020-09-17 20:15:42 · 309 阅读 · 0 评论 -
二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。先看一下我的错误代码class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { if(matrix.length==0||matrix[0].length==0||matri原创 2020-09-16 21:29:38 · 43 阅读 · 0 评论 -
两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]题解class Solution { public int[] twoSum(int[] nums, int target) { .原创 2020-09-08 22:25:38 · 61 阅读 · 0 评论