![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
梦里Coding
bigData
展开
-
JZ30-连续子数组的最大和
描述输入一个长度为n的整型数组a,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n).示例1输入:[1,-2,3,10,-4,7,2,-5]返回值:18说明:输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和 18。思路:采用的是动态规划的思路。public class Solution { public int FindGreatestSumOfSubArray(in原创 2021-09-22 13:27:03 · 76 阅读 · 0 评论 -
JZ37 数字在升序数组中出现的次数
描述:给定一个长度为 n的非降序数组和一个非负数整数k,要求统计k在数组中出现的次数.示例1输入:[1,2,3,3,3,3,4,5],3返回值:4思路:用传统的暴力破解很轻松就能做出来,这里考察主要是二分查找, 看到有序的数组进行查找,第一眼想到的就是采用二分来进行查找.1.这里我在写二分查找的时候,有几个地方需要注意:在写大循环,while(low<=high)的时候符号是<=.2.在最后通过二分查找找到目标值k之后,定义两个指针向两边进行查找完毕之后,要记得break,结束循原创 2021-09-21 11:36:59 · 135 阅读 · 0 评论 -
剑指offer:JZ18 二叉树的镜像
描述操作给定的二叉树,将其变换为源二叉树的镜像。比如: 源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5示例:输入:{8,6,10,5,7,9,11}返回值:{8,10原创 2021-09-08 15:17:42 · 95 阅读 · 0 评论 -
剑指offer:JZ14 链表中倒数最后k个结点
JZ14 链表中倒数最后k个结点描述输入一个链表,输出一个链表,该输出链表包含原链表中从倒数第k个结点至尾节点的全部节点。如果该链表长度小于k,请返回一个长度为 0 的链表。示例1输入:{1,2,3,4,5},1返回值:{5}思路:定义两个指针,一个快指针一个慢指针,先让快指针先走k个节点,再让慢指针从头开始移动.这样的话快指针和慢指针相差k个节点,这时候当快指针移动到结尾的时候,return 慢指针也就是最后的k个节点.import java.util.*;/* * public原创 2021-09-07 16:35:18 · 121 阅读 · 0 评论 -
剑指offer:JZ13 调整数组顺序使奇数位于偶数前面
JZ13 调整数组顺序使奇数位于偶数前面描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。示例1输入:[1,2,3,4]返回值:[1,3,2,4]思路:定义两个数组,一个存放奇数,一个存放偶数,遍历原数据,碰到奇数的放在奇数数组中,碰到偶数的放到偶数数组中,最后定义一个整合结果的数组,首先添加奇数数组中的元素,再添加偶数数组中的元素.import java.util.原创 2021-09-07 15:39:09 · 107 阅读 · 0 评论 -
剑指offer:JZ11 二进制中1的个数
描述输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。示例1输入:输入:10返回值:2思路:逻辑与的操作理解成一个串行电路,两个开关都闭合时才有电,因此两个都为1才为1,是逻辑与的结果,那么对1进行逻辑与操作在画出二进制进行运算的时候认真观察就会发现,1的二进制位数永远是最右边为1,因此我们可以对要测的数与1进行逻辑与操作,如果结果为1,计数器加1,接着往右移动一位,继续逻辑与操作.直到整个数为0时退出循环public class Solution { pub原创 2021-09-07 10:31:47 · 221 阅读 · 0 评论 -
(常考题)反转链表
描述输入一个链表,反转链表后,输出新链表的表头。输入一个链表,反转链表后,输出新链表的表头。输入:{1,2,3}返回值:{3,2,1}思路:利用两个指针,pre和cur.pre用来记录cur的前一个节点,cur用来记录当前节点public class Solution { public ListNode ReverseList(ListNode head) { ListNode pre=null; ListNode cur=head;原创 2021-09-05 14:58:31 · 52 阅读 · 0 评论 -
JZ4 重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思路因为是树的结构,一般都是用递归来实现。用数学归纳法的思想就是,假设最后一步,就是root的左右子树都已经重建好了,那么我只要考虑将root的左右子树安上去即可。根据前序遍历的性质,第一个元素必然就是root,那么下面的工作就是如何确定root的左右子原创 2021-09-05 10:47:54 · 53 阅读 · 0 评论 -
JZ3 从尾到头打印链表
描述输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。如输入{1,2,3}的链表如下图:返回一个数组为[3,2,1]思路:反向打印链表,这种题目,一条思路是通过递归,递归到最后,再将值添加到所创建的数组当中。这个方法主要是用于加强对递归使用的理解,但是无法AC。import java.util.ArrayList;public class Solution { ArrayList<Integer> list=new ArrayList<>原创 2021-09-04 19:22:47 · 59 阅读 · 0 评论 -
剑指offer:二维数组中的查找
描述在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]给定 target = 7,返回 true。给定 target = 3,返回 false。输入:7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]原创 2021-09-04 13:23:57 · 84 阅读 · 0 评论 -
剑指offer:数组中只出现一次的两个数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。输入:[1,4,1,6]输出:[4,6]说明:返回的结果中较小的数排在前面思路:(1)定义一个hashmap来存储存储所遍历的数组,如果该数字在hashmap中没有出现过,则将其添加进hashmap,如果出现过,就将其出现次数增加1.(2)遍历hashmap,将其中的出现次数等于1的数字添加进新定义的数组当中,最后对数组进行排序.返回数组即可.import java.util.*;publ原创 2021-04-03 15:03:23 · 107 阅读 · 0 评论 -
剑指Offer:数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。思路:判断该数据流是奇数还是偶数,奇数直接返回中间位数,偶数直接返回中间两值的平均值.import java.util.*;public class Solution { ArrayList<Inte原创 2021-04-02 10:49:16 · 50 阅读 · 0 评论 -
剑指offer:数组中重复的数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任一一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1输入:[2,3,1,0,2,5,3]输出:2或3思路:(1)先判断数组是否合法,不合法直接返回-1.(2)对数组进行排序(3)遍历数组,将数字和数字出现的次数存储在HashMap中(4)遍历HashMap,原创 2021-03-31 14:47:45 · 56 阅读 · 0 评论 -
剑指Offer:字符流中第一个不重复的字符
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。返回值描述:如果当前字符流没有存在出现一次的字符,返回#字符。思路:该题与之前做过的题有点相似,区别在于这道题是动态的,例如"goole"这个字符串,当读到"go"时,输出"g",当读到"goo",输出"g",读到"goog",输出"#".运用一个map来记录字符和所出现的次数,一原创 2021-03-31 11:31:07 · 93 阅读 · 0 评论 -
剑指Offer:翻转单词序列
题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?输入:“nowcoder. a am I” 输出:"I am a nowcoder."解题思路:(1)通过spllit方法,对str原创 2021-03-30 18:16:20 · 102 阅读 · 0 评论 -
剑指offer:第一个只出现一次的字符
题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数).解题思路:(1)对字符串进行遍历,利用HashMap来对遍历的字母进行存储,如果该字符在Hashmap的keySet中不存在,就将其添加.如果存在,就将Value值+1.(2)遍历HashMap,输出第一个Value为1的字符下标.import java.util.*public class Solution {原创 2021-03-30 16:13:06 · 55 阅读 · 0 评论 -
剑指offer:剪绳子
题目描述:给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。解题思路:这道题是动态规划的问题。自己先对刚开始比较简单的数字1,2,3进行拆分,可以极其容易想到拆分开之后最大的乘积也分别是1,2,3,可以写个判断语句用来返回本身。在大于4之后,也就是从5开始,我原创 2020-07-26 16:17:42 · 85 阅读 · 0 评论 -
剑指offer:求1+2+3+...+n
题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。解题思路:重点在于不能使用经常用到的循环和判断语句,因此思路就转向递归。``public class Solution { public int Sum_Solution(int n) { int sum=n; boolean flag = (n>0)&&((sum+=Sum_Solution(-原创 2020-07-20 20:46:08 · 104 阅读 · 0 评论 -
剑指offer:二叉搜索树的后续遍历
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解题思路:这个题目关键在于理清后序遍历有什么特点。二叉搜索树的后序遍历:该序列的最后一个元素作为一个指标,从头开始遍历,如果遍历到一个元素,它大于最后一个元素。这个时候就可以判断该元素之前的所有元素都小于最后一个元素。而该元素之后所有的元素都大于最后一个元素,满足该条件就是二叉搜索树的后序遍历。例子: 2 4 3 6 8 7 5 这是一个正确的后序遍历这个原创 2020-07-06 23:39:30 · 83 阅读 · 0 评论 -
剑指offer:包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法解题思路:要求能够得到栈中的最小元素,且时间复杂度为O(1)。采用的是空间换时间的思想:定义两个栈,一个栈(stackTotal)按照正常的顺序添加元素,另一个栈作为辅助栈(stackMin),用来存储当前正常栈里面的最小值元素。stackTotal添加一个元素,就去判断stackMin的情况,如果stack原创 2020-07-06 22:31:35 · 85 阅读 · 0 评论 -
剑指offer:栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解题思路:首先判断两个数组是否为空。如果为空的话先返回false;接着就是不为空的情况,定义一个栈和一个出栈顺序的变量popIndex,该变量用来指向出栈数组中的当前位置。将pushA中的元素进原创 2020-07-03 00:12:33 · 71 阅读 · 0 评论 -
剑指offer题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印。
题目描述:从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路解析:题目要求从上到下,同层节点从左至右打印。顾名思义,应当采用层序遍历。对于层序遍历的具体的实现,采用一个ArrayList来模拟队列的实现。...原创 2020-07-02 23:34:48 · 258 阅读 · 0 评论 -
剑指offer:用两个栈来实现一个队列,完成队列的Push和Pop操作。
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:栈的特点是先进后出,队列的特点是先进先出。要想让入栈的顺序变成队列的先进先出,可以先将数据push进一个栈,都push完了之后就出栈,用另一个栈来接收,再出栈。顺序即可变成先进先出。import java.util.Stack;public class Solution { Stack<Integer> stack1 = new Stack<Integer>();原创 2020-06-18 19:37:06 · 443 阅读 · 0 评论