剑指offer
一枚蛋挞
走向一枚程序媛的路上
展开
-
leetcode581-最短连续无序子数组
题目描述给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。请你找出符合题意的 最短 子数组,并输出它的长度。思路整个数组可以分成三段,左段(升序),中段(无序),右段(升序)。中段的最大值小于右段的所有值,中段的最小值大于左段的最大值。从左往右遍历数组,维护最大值,最右侧的小于最大值的元素,就是无序数组的右边界。从右往左遍历数组,维护最小值,最左侧大于最小值的元素,就是无序数组的左边界。代码int len = nums.原创 2021-02-08 10:58:13 · 99 阅读 · 0 评论 -
修剪二叉搜索树
题目给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树不应该改变保留在树中的元素的相对结构(即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在唯一的答案。所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。代码/** * Definition for a binary tree node. * public class TreeNode {原创 2021-01-25 12:05:22 · 89 阅读 · 0 评论 -
复制链表的复制深拷贝
题目请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。思路第一步,将1-2-3链表变成1-1-2-2-3-3,每个节点都复制一个其克隆节点。第二步,将复制的克隆节点的random赋值。第三步,将链表剥离,恢复原链表,并产生复制链表。代码/*// Definition for a Node.class Node { int val; No原创 2021-01-13 20:48:27 · 542 阅读 · 2 评论 -
删除链表中的重复元素
题目给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { thi原创 2021-01-13 13:19:52 · 390 阅读 · 3 评论 -
剑指offer链表中环的入口节点
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路建两个指针,快指针,慢指针,快指针一次走两步,慢指针一次走一步。如果没环,那快指针肯定会先走到尾节点。如果有环,那么快慢指针一定会在某一时刻在环中相遇(类似龟兔赛跑扣圈)。设无环部分的链表有a个节点,有环部分的链表有b个节点。快指针的路程为f,慢指针的路程为s。那么有 f = 2s...原创 2021-01-11 17:33:57 · 144 阅读 · 0 评论 -
剑指offer调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路题目要求,调整后的相对位置不变。利用快慢指针,快指针进行遍历,遇到偶数继续往下走,慢指针用来指向下一个奇数需要插入的位置。遇到奇数则将两指针指向的元素之间的所有元素进行后移一位,并将当前奇数移动到慢指针指向的位置。代码public class Solution { public void reOrderArray原创 2021-01-10 09:48:28 · 84 阅读 · 0 评论 -
剑指offer二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。思路关键字:二叉搜索树,排序,要求原地置换。可以进行中序遍历,遍历过程中,保存上一个节点,调整当前节点的left指向和上一个节点的right指向。最后对头尾节点对指向进行特殊处理即可。代码class Solution { Node temp,head; public Node treeToDoublyList(Node root) { if(r原创 2021-01-07 19:19:40 · 101 阅读 · 0 评论 -
剑指offer旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。代码import java.util.ArrayList;public class Solution { public int minNumberInRotateArray(int [] array) { int len = array.length; if(len原创 2021-01-05 19:56:03 · 69 阅读 · 0 评论 -
剑指offer连续子数的最大和
题目描述输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n).题解动态规划思想转移方程:dp[i-1] > 0 时,dp[i] = dp[i-1]+array[i]dp[i-1] < 0 时,dp[i] = array[i]dp[i-1]小于0,则认为其毫无意义,是“负担”,弃之dp[i-1]大于0,则认为其有帮助,是“利益”,留之随时更新子数组的和的最大值,返回。代码public class原创 2021-01-04 15:40:14 · 78 阅读 · 0 评论 -
剑指offer数组中只出现一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。题解位运算基础:如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。因此数组中所有元素进行异或运算得到的结果,也就是两个只出现一次的数字运算的结果。假设结果为1110,为1的位说明,这两个出现一次的数字在该位置的值不同,一个为01,一个为1从右向左,第二位结果是1,根据此进行分组。数组元素中第二位是1的为一组,第二位是0的为另一组。分别进行异或后得到的两个值即为结果。代码原创 2021-01-04 14:28:55 · 118 阅读 · 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。题解尽可能多的拆分出3,乘积最大。特殊情况为4时,拆成2和2。代码public int cutRope(int target) { int res = 1; whil原创 2021-01-04 12:16:50 · 83 阅读 · 0 评论 -
剑指offer-变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。题解该题为青蛙跳台阶的进阶版本,递归思想一致f(3) = f(2)+f(1)+1;f(n) = f(n-1)+…+1;这里的加一操作,其实很容易理解,就是直接跳n个台阶,为一种跳法,所以不妨把f(0)设为1,也就是f(n) = f(n-1)+…+f(1)+f(0)。public int JumpFloorII(int target){ //f(n) = f(n-1)原创 2020-12-31 17:40:44 · 69 阅读 · 0 评论 -
leetcode.剑指offer.面试48.最长不含重复字符的子字符串
leetcode.剑指offer.面试48.最长不含重复字符的子字符串题目解题思路Java代码描述题目请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。解题思路此题在一个多月之前已经AK过,但是印象中当时做的时候也不是很顺利,思考的比较久。但未想到,今天再次做的时候,居然生生用了两个多小时才通过。而且过程中出错的地方不少,可谓非常坎坷。痛定思痛,决定要把这道题的...原创 2020-04-22 17:54:11 · 220 阅读 · 0 评论 -
leetcode.剑指offer.面试31栈的压入弹出顺序
leetcode.剑指offer.栈的压入弹出顺序题目解题思路Java代码描述题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。解题思路手动模拟入栈...原创 2020-04-22 17:28:17 · 178 阅读 · 0 评论 -
leetcode.剑指offer.面试09用两个栈实现一个队列
两个栈实现一个队列题目解题思路Java代码描述题目两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )解题思路建两个栈,栈1用来插入元素,栈2用来实现删除元素。队列的性质是先进先出,而栈是先进后出。因此想要删除元素,需要讲栈...原创 2020-04-21 10:44:30 · 192 阅读 · 0 评论 -
leetcode.剑指offer.面试68I.二叉搜索树的最近公共祖先
leetcode.剑指offer.面试68I.二叉搜索树的最近公共祖先题目解题思路Java代码描述题目给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。解题思路根据二叉搜索树的特点,遍历二叉树,(1)当前节点大于p和q的val值,则p,q都在当前节点左子树,遍历左子树(2)当前节点小于p和q的val值,则p,q都在当前节点右子树,遍历右子树(3)当前节点大于p的val值小于...原创 2020-04-11 20:53:23 · 164 阅读 · 0 评论 -
leetcode.top100.19题.删除链表倒数第k个节点(双指针思想)
leetcode.top100.19题.删除链表倒数第k个节点题目解题思路Java代码描述题目给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。解题思路创建虚拟节点,其next指向head节点。创建快慢指针,先让快指针走n步,然后一起走。这种快慢指针的思想与剑指offer的倒数第k个节点这道题基本一致(为了迎合删除需要,本题的慢指针初始时指向虚拟节点)。定位到要删除的节点后...原创 2020-04-11 17:04:25 · 376 阅读 · 0 评论 -
leetcode.剑指offer.面试题24.反转链表
leetcode.剑指offer.面试题24.反转链表题目解题思路代码题目定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。解题思路创建虚拟指针,头插法插入节点。时间复杂度O(n),空间复杂度O(1)。代码public ListNode reverseList(ListNode head) { //链表为空或只有一个节点,无需反转,直接返回 if...原创 2020-04-09 22:13:06 · 267 阅读 · 0 评论 -
leetcode剑指offer.面试题18.删除链表的节点
leetcode的剑指offer.面试题18.删除链表节点题目解题思路下面为java代码描述,仅供参考题目给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。注意:此题对比原题有改动示例链接: link.转载来源:力扣(LeetCode)解题思路新建一个虚拟节点,指向链表头节点。遍历链表,当前节点node的下一个节点val值等于给定的va...原创 2020-04-09 14:00:23 · 371 阅读 · 0 评论 -
剑指offer.面试题52.两个链表的第一个公共节点
剑指offer.面试题52.两个链表的第一个公共节点题目解题思路题目*输入两个链表,找出它们的第一个公共节点。如下面的两个链表:在节点c1开始相交。解题思路(1)利用两个指针,初始时分别指向两个链表头节点。遍历两个链表,分别计算出各自链表长度,求出长度的差值count。(2)长链表的头指针先移动count步,即遍历count个节点,然后两个链表的头指针开始同步移动。当两个指针指向同...原创 2020-04-09 09:43:35 · 312 阅读 · 0 评论 -
剑指offer面试题22. 链表中倒数第k个节点
剑指offer面试题22. 链表中倒数第k个节点题目题目输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。示例给定一个链表: 1->2->3->4->5, 和 k = 2. 返回链表 ...原创 2020-04-08 22:20:04 · 303 阅读 · 0 评论