剑指offer-3
剑指 Offer 50. 第一个只出现一次的字符 - 力扣(LeetCode)
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
1 | class Solution { |
剑指 Offer 51. 数组中的逆序对 - 力扣(LeetCode)
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
常规的思想:使用两重循环,但是会超时。
使用归并排序的思想,
时间复杂度 O(N \log N),不会超时
1 | //归并排序 |
剑指 Offer 52. 两个链表的第一个公共节点 - 力扣(LeetCode)
输入两个链表,找出它们的第一个公共节点。思路就是A指针先遍历A链表,遍历完再遍历B。B指针先遍历B链表,再遍历A链表,两者相遇的节点即为相交节点
1 | /** |
剑指 Offer 43. 1~n 整数中 1 出现的次数 - 力扣(LeetCode)
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
1 | class Solution { |
剑指 Offer 44. 数字序列中某一位的数字 - 力扣(LeetCode)
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数,求任意第n位对应的数字。
1 | class Solution { |
剑指 Offer 46. 把数字翻译成字符串 - 力扣(LeetCode)
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
动态规划的思想:如果前面的两个数在10到25之间,就有dp[i - 1] + dp[i - 2]中翻译方法,否则就有dp[i - 1] 中翻译方法。
1 | class Solution { |
剑指 Offer 53 - I. 在排序数组中查找数字 I - 力扣(LeetCode)
统计一个数字在排序数组中出现的次数。
1 | class Solution { |
剑指 Offer 47. 礼物的最大价值 - 力扣(LeetCode)
在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?
动态规划经典题型了。
1 | class Solution { |
剑指 Offer 48. 最长不含重复字符的子字符串 - 力扣(LeetCode)
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
1 | class Solution { |
剑指 Offer 49. 丑数 - 力扣(LeetCode)
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
1 | //丑数应该是1*2, 1*3, 1*5, 2*2, 2*3, 2*5, 3*2, 3*3, 3*5, ... , n1 *2, n1 * 3, n1 * 5, n2 * 2, n3* 3, n2 * 5排序后得到 |
剑指 Offer 53 - II. 0~n-1中缺失的数字 - 力扣(LeetCode)
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
1 | class Solution { |
剑指 Offer 54. 二叉搜索树的第k大节点 - 力扣(LeetCode)
给定一棵二叉搜索树,请找出其中第 k
大的节点的值。
二叉搜索树中序遍历是递增的,逆中序遍历就是递减的。因此可以用右中左进行遍历,就可以得到第k大的节点。
1 | /** |
剑指 Offer 55 - I. 二叉树的深度 - 力扣(LeetCode)
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
例如:
给定二叉树 [3,9,20,null,null,15,7],
1 | /** |
剑指 Offer 55 - II. 平衡二叉树 - 力扣(LeetCode)
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
1 | /** |
剑指 Offer 56 - I. 数组中数字出现的次数 - 力扣(LeetCode)
一个整型数组 nums
里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
1 | class Solution { |
还有一种异或的方法,效率更高:
1 | class Solution { |
剑指 Offer 56 - II. 数组中数字出现的次数 II - 力扣(LeetCode)
上一题稍微修改一下就行了。
1 | class Solution { |
剑指 Offer 57. 和为s的两个数字 - 力扣(LeetCode)
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
1 | class Solution { |
剑指 Offer 57 - II. 和为s的连续正数序列 - 力扣(LeetCode)
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
双指针法,求和计算
1 | class Solution { |
剑指 Offer 58 - I. 翻转单词顺序 - 力扣(LeetCode)
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串”I am a student. “,则输出”student. a am I”。
1 | class Solution { |
剑指 Offer 59 - I. 滑动窗口的最大值 - 力扣(LeetCode)
给定一个数组 nums
和滑动窗口的大小 k
,请找出所有滑动窗口里的最大值。
单调队列的思想,可以自己实现一个单调队列,队列从大到小排列,队列的front应该对应滑动窗口中的 最大值。
1 | //单调队列的思想, 始终保持队列的front对应的是滑动窗口内的最大值 |