- 博客(26)
- 收藏
- 关注
原创 31. 下一个排列
31. 下一个排列实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须 原地 修改,只允许使用额外常数空间。字典顺序[1,2,3][1,3,2][2,1,3][2,3,1][3,1,2][3,2,1][1,2,3]思路:1.先理解题意 读懂题2.找到第一个顺序对 即较小的数 a[i]3.再找到较大的数 a[j] 交换i j4.直接将翻转[i,n]class Solu
2020-12-29 10:37:26
130
原创 22. 括号生成
22. 括号生成数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。思路:1.暴力法:排列组合将所有的情况列出,判断出有效的括号组合2.回溯法:添加右括号要满足两个条件插入数量不超过n可以插入 )右括号 的前提是 (左括号 的数量大于 )右括号class Solution { public List<String> generateParenthesis(int n) { //括号组合 List<
2020-12-21 17:29:03
113
原创 21. 合并两个有序链表
21. 合并两个有序链表将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。思路:递归实现,新链表也不需要构造新节点,终止条件:两条链表分别名为 l1 和 l2,当 l1 为空或 l2 为空时结束,返回值:每一层调用都返回排序好的链表头,如果 l1 的 val 值更小,则将 l1.next 与排序好的链表头相接,l2 同理。/** * Definition for singly-linked list. * public class ListNode {
2020-12-21 08:50:41
116
原创 20. 有效的括号
20. 有效的括号给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串思路:使用栈判断括号的有效性可以使用「栈」这一数据结构来解决。我们对给定的字符串 ss 进行遍历,当我们遇到一个左括号时,我们会期望在后续的遍历中,有一个相同类型的右括号将其闭合。由于后遇到的左括号要先闭合,因此我们可以将这个左括号放入栈顶。当我们遇到一个右括号时,我们
2020-12-19 11:51:38
168
1
原创 19. 删除链表的倒数第N个节点
19. 删除链表的倒数第N个节点给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。整体思路是让前面的指针先移动n步,之后前后指针共同移动直到前面的指针到尾部为止代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.va
2020-12-19 11:04:01
132
1
原创 11. 盛最多水的容器
11. 盛最多水的容器给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。输入:[1,8,6,2,5,4,8,3,7]输出:49解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。思路:双指针 左右移动容纳的水量 = 两个
2020-12-16 17:21:58
170
原创 6. Z 字形变换
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:L C I RE T O E S I I GE D H N之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。请你实现这个将字符串进行指定行数变换的函数:string convert(string s, int numRows);示例 1:输入: s = “LEET
2020-12-16 16:59:53
88
原创 4. 寻找两个正序数组的中位数
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?思路:已知数组的长度 使用双指针O(m+n)class Solution { public double findMedianSortedArrays(int[] nums1, int[] nums2) { // 两数组总长 int len = nums1.length
2020-12-09 11:33:16
87
原创 15.三数之和
15. 三数之和给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。两种思路:1.暴力方法(三重循环):class Solution { public List<List<Integer>> threeSum(int[] nums) { int n = nums.length; Set
2020-12-01 20:23:13
108
原创 3. 无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。解决思路:滑动窗口用到的数据结构:HashMap 判断是否存在key为字符 value为字符位置+1 (表示从后面一位不重复)class Solution { public int lengthOfLongestSubstring(String s) { int n = s.length();
2020-11-23 11:02:43
105
原创 JZ1.二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:1.暴力遍历数组public class Solution { public boolean Find(int target, int [][] array) { for(int i = 0; i < array.length; i++){
2020-07-29 10:32:33
954
原创 32.1 从上往下打印二叉树
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。核心思想:每次出队一个元素,就将该元素的孩子节点加入队列中,直至队列中元素个数为0时,出队的顺序就是该二叉树的层次遍历结果。import java.util.ArrayList;import java.util.LinkedList;import java.util.Queue;/**public class TreeNode { int val = 0; TreeNode left = null;
2020-07-06 23:37:35
115
原创 31. 栈的压入、弹出序列
题目描述题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路:思路1:判断栈顶是否为第二序列的数,是就弹出,不是就讲第一序列的数压入,直至栈顶出现第二数列的数,如果第一数列为空都没有出现说明不可能是弹出序列。思路2:判断辅助栈是否为空。
2020-07-06 23:05:59
145
原创 23. 链表中环的入口结点
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路:1.判断链表中有环 -> 2.得到环中节点的数目 -> 3.找到环中的入口节点public class Solution { public ListNode EntryNodeOfLoop(ListNode pHead) { if(pHead == null) return null; ListNode l = pHead, f
2020-07-02 10:49:20
167
原创 12. 矩阵中的路径
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。if(r < 0 || r >= rows || c < 0 || c >=
2020-06-29 11:15:09
123
原创 11. 旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路:二分法import java.util.ArrayList;public class Solution { public int minNumberInRotateArray(int [] array)
2020-06-22 11:56:31
109
原创 10.4 变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:每个台阶都有跳与不跳两种情况(除了最后一个台阶),最后一个台阶必须跳。所以共用2^(n-1)中情况public class Solution { public int JumpFloorII(int target) { return (int) Math.pow(2,target-1); }}pow 是double的。f(n) = f(n
2020-06-17 11:01:07
121
原创 10.3 跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。思路:斐波那契数列应用当 n = 1 时,只有一种跳法:当 n = 2 时,有两种跳法:跳 n 阶台阶,可以先跳 1 阶台阶,再跳 n-1 阶台阶;或者先跳 2 阶台阶,再跳 n-2 阶台阶。而 n-1 和 n-2 阶台阶的跳法可以看成子问题,该问题的递推公式为:public class Solution { public int JumpFloor(int t
2020-06-17 10:30:04
115
原创 10.2 矩形覆盖
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,23的矩形块有3种覆盖方法:思路:斐波那契数列的应用当 n 为 1 时,只有一种覆盖方法当 n 为 2 时,有两种覆盖方法当 n 大于 2 时,当用21小矩形竖着放,则摆放方法总共为f(target - 1)当用2*1小矩形横着放,则摆放方法总共为f(target - 2)public class Solution { public int R
2020-06-17 10:24:13
117
原创 10.1 斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n<=39递归public class Solution { public int Fibonacci(int n) { if(n <= 1) return n; else return Fibonacci(n-1)+Fibonacci(n-2); }}会重复计算一些子问题,计算
2020-06-17 09:57:11
200
原创 9. 用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:in栈stack1实现Push操作out栈stack2实现Pop操作push 入队pop 出队入队:将元素进栈1出队:判断栈2是否为空,如果为空,则将栈1中所有元素pop,并push进栈2,栈2出栈;如果不为空,栈2直接出栈。import java.util.Stack;public class Solution { Stack<Integer> stack1 = ne
2020-06-16 21:22:05
91
原创 8. 二叉树的下一个结点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:中序遍历 左根右两种情况:此结点有有结点,则下一个结点是右子树最左结点没有,就想上找到第一个左连接指向的树包含该节点的祖先节点。(相当于判断是否为左子树,那他下一个结点就是根结点)/*public class TreeLinkNode { int val; TreeLinkNode left = null; Tree
2020-06-14 13:03:59
144
原创 7. 重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:1.前序 找根2.中序 利用根分左右3.利用递归遇到的困难:参数的设置确定左子树的大小(范围)得到前序中的左子树然后得到中序中的左子树右子树同左子树。/** * Definition for binary tree * public c
2020-06-14 11:33:00
199
原创 6. 从尾到头打印链表
题目描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList。递归法/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* }* }**/import java.util.ArrayList;public class Solution
2020-06-14 10:33:11
183
原创 5.替换空格
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。遇到的问题:用例不过,因为str.append(" ");中添加的空格不是多了就是少了;应该是两个,算上之前的空格正好三个替换为%20字符串。复习的地方:StringBuffer 的方法char charAt(int index)返回指定索引处的 char 值void setCharAt(int index, char ch)
2020-06-12 10:58:02
96
原创 2.二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。.length属性用于访问一个数组的长度数组访问下标范围是0到长度-1二维数组是在一维数组中嵌套实现的要取行数和某一行的列数可以 :int rowLen = a.length;int colLen = a[0].length;暴力法挨个遍历数组,如果找到就返回 truepublic cl
2020-06-04 13:35:06
168
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅