【LeetCode】《剑指Offer》第Ⅴ篇⊰⊰⊰ 39 - 47题

文章目录

  • 【LeetCode】《剑指Offer》第Ⅴ篇⊰⊰⊰ 39 - 47题
    • 39. 数组中出现次数超过一半的数字(easy)
    • 40. 最小的k个数(easy)
    • 41. 数据流中的中位数(hard)
    • 42. 连续子数组的最大和(easy)
    • 43. 1~n 整数中 1 出现的次数(hard)
    • 44. 数字序列中某一位的数字(medium)
    • 45. 把数组排成最小的数(medium)
    • 46. 把数字翻译成字符串(medium)
    • 47. 礼物的最大价值(medium)

39. 数组中出现次数超过一半的数字(easy)

剑指 Offer 39. 数组中出现次数超过一半的数字

题目】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

限制:

1 <= 数组长度 <= 50000

示例

输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2

解题思路

摩尔投票法

class Solution {public int majorityElement(int[] nums) {int count = 0, res = 0;for (int num : nums) {if (num == res) {count++;} else {if (count > 0) {count--;} else {count = 1;res = num;}}}return res;}
}

40. 最小的k个数(easy)

剑指 Offer 40. 最小的k个数

题目】输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。

限制:

  • 0 <= k <= arr.length <= 10000
  • 0 <= arr[i] <= 10000

示例

输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]

解题思路

方法很多,选择排序、快排、堆排序,

此处采用大根堆

class Solution {public int[] getLeastNumbers(int[] arr, int k) {PriorityQueue<Integer> queue = new PriorityQueue<>();for (int x : arr) queue.offer(x);int[] res = new int[k];for (int i = 0; i < k; i++) {res[i] = queue.poll();}return res;}
}

41. 数据流中的中位数(hard)

剑指 Offer 41. 数据流中的中位数

题目】如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。

例如,

[2,3,4] 的中位数是 3

[2,3] 的中位数是 (2 + 3) / 2 = 2.5

设计一个支持以下两种操作的数据结构:

void addNum(int num) - 从数据流中添加一个整数到数据结构中。
double findMedian() - 返回目前所有元素的中位数。

限制:

  • 最多会对 addNum、findMedian 进行 50000 次调用。

示例

输入:
["MedianFinder","addNum","addNum","findMedian","addNum","findMedian"]
[[],[1],[2],[],[3],[]]
输出:[null,null,null,1.50000,null,2.00000]

解题思路

详细见往期博客总结【LeetCode】求中位数(数据流、滑动窗口、两个正序数组)

class MedianFinder {PriorityQueue<Integer> left;   //大根堆PriorityQueue<Integer> right;  //小根堆/** initialize your data structure here. */public MedianFinder() {left  = new PriorityQueue<Integer>((o1, o2) -> o2 - o1);right = new PriorityQueue<Integer>();}public void addNum(int num) {left.offer(num);right.offer(left.poll());if (left.size() + 1 < right.size()) {left.offer(right.poll());}}public double findMedian() {if (right.size() > left.size()) {return (double)right.peek();} else {return (double)(left.peek() + right.peek()) / 2;}}
}

42. 连续子数组的最大和(easy)

剑指 Offer 42. 连续子数组的最大和

题目】输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

要求时间复杂度为O(n)。

提示:

  • 1 <= arr.length <= 10^5
  • -100 <= arr[i] <= 100

示例

输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

解题思路

贪心+动态规划

class Solution {public int maxSubArray(int[] nums) {int res = nums[0];for (int i = 1; i < nums.length; i++) {if (nums[i - 1] > 0) {nums[i] += nums[i - 1];}res = Math.max(res, nums[i]);}return res;}
}

43. 1~n 整数中 1 出现的次数(hard)

剑指 Offer 43. 1~n 整数中 1 出现的次数

题目】输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。

例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。

限制:

  • 1 <= n < 2^31

示例

输入:n = 12
输出:5

解题思路

找规律,

9—1个1,

99—20个1,

999—300个1,

9999—4000个1

参考热评@细b

class Solution {public int countDigitOne(int n) {return f(n);}private int f(int n) {if (n == 0) {return 0;}if (n < 10) {return 1;}String sn = String.valueOf(n);int high = sn.charAt(0) - '0';int base = (sn.length() - 1) * (int)Math.pow(10, sn.length() - 2);int cur  = (int)Math.pow(10, sn.length() - 1);if (high == 1) {return base + n - cur + 1 + f(n - high * cur);} else {return base * high + cur + f(n - high * cur);}}
}

44. 数字序列中某一位的数字(medium)

剑指 Offer 44. 数字序列中某一位的数字

题目】数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。

请写一个函数,求任意第n位对应的数字。

限制:

  • 0 <= n < 2^31

示例

输入:n = 3
输出:3
------------------------
输入:n = 11
输出:0

解题思路

找规律

class Solution {public int findNthDigit(int n) {int k = 0;for (int i = 1; i < 10; i++) {long t = (i == 1) ? 10 : (long)Math.pow(10, i - 1) * 9 * i;if (n < t) {k = i;break;}n -= t;}int d = 0, r = 0;// 加1是因为下标是从0开始算的if ((n + 1) % k == 0) {d = n / k;r = k;} else {d = (n + 1) / k;r = (n + 1) % k;}int num = (int)Math.pow(10, k - 1) + d;if (k == 1) num -= 1;return String.valueOf(num).charAt(r - 1) - '0';}
}

45. 把数组排成最小的数(medium)

剑指 Offer 45. 把数组排成最小的数

题目】输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个

提示:

  • 0 < nums.length <= 100

示例

输入: [3,30,34,5,9]
输出: "3033459"

解题思路

字符串排序,

关键点: 比较 (a + b)(b + a)

class Solution {public String minNumber(int[] nums) {ArrayList<String> list = new ArrayList<>();for (int num : nums) {list.add(String.valueOf(num));}Collections.sort(list, (o1, o2) -> {return (o1 + o2).compareTo(o2 + o1);});return String.join("", list);}
}

46. 把数字翻译成字符串(medium)

剑指 Offer 46. 把数字翻译成字符串

题目】给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法

提示:

  • 0 <= num < 231

示例

输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"

解题思路

方法一:

递归

class Solution {public int translateNum(int num) {if (num <= 9) return 1;int t = num % 100;if (t <= 9 || t >= 26) return translateNum(num / 10);return translateNum(num / 10) + translateNum(num / 100);}
}

方法二:

动态规划

class Solution {public int translateNum(int num) {if (num <= 9) return 1;String str = String.valueOf(num);int[] dp = new int[str.length() + 1];dp[0] = dp[1] = 1;for (int i = 2; i <= str.length(); i++) {String part = str.substring(i - 2, i);if (part.compareTo("10") >= 0 && part.compareTo("25") <= 0) {dp[i] = dp[i - 1] + dp[i - 2];} else {dp[i] = dp[i - 1];}}return dp[str.length()];}
}

47. 礼物的最大价值(medium)

剑指 Offer 47. 礼物的最大价值

题目】在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?

示例

输入:
[[1,3,1],[1,5,1],[4,2,1]
]
输出: 12
解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物

解题思路

动态规划

class Solution {public int maxValue(int[][] grid) {int []dp = new int[grid[0].length + 1];for (int i = 1; i <= grid.length; i++) {for (int j = 1; j <= grid[0].length; j++) {dp[j] = Math.max(dp[j], dp[j - 1]) + grid[i - 1][j - 1];}}return dp[grid[0].length];}
}

【LeetCode】《剑指Offer》第Ⅴ篇⊰⊰⊰ 39 - 47题相关推荐

  1. [剑指offer]面试题第[47]题[JAVA][礼物的最大价值][动态规划]

    [问题描述][中等] [解答思路] 1动态规划 动态规划流程 第 1 步:设计状态 f(i, j)f(i,j) 为从棋盘左上角走至单元格 (i ,j)(i,j) 的礼物最大累计价值 第 2 步:状态转 ...

  2. C++版 - 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解

    剑指offer 面试题39:判断平衡二叉树 提交网址:  http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId= ...

  3. leetcode 打印_剑指 Offer 总结 - leetcode 剑指offer系列

    剑指 Offer 系列完结撒花!! 本篇文章是对整个系列的精华总结, 对系列的每篇文章进行了分类, 并用一句话概括每道题的思路, 方便大家理解和记忆, 当然也包含原文完整链接供大家参考 总的来说, 写 ...

  4. [剑指offer]面试题第[57]题[Leetcode][第167题][JAVA][和为s的两个数字][两数之和][HashSet][二分][双指针]

    [剑指offer]面试题第[57]题[Leetcode][第167题][第1题] 有序无序之分 题目输出不同之分 以下解法按照[剑指offer]面试题第[57]题进行题解 [问题描述][简单] 输入一 ...

  5. Leetcode剑指offer(五)

    Leetcode剑指offer 31从上到下打印二叉树 II(32-2.Easy) 1)题目要求 2)我的解法 3)其他解法 4)自己的优化代码 5)学到的东西 32.从上到下打印二叉树 III(32 ...

  6. 【LeetCode 剑指offer刷题】树题6:28 对称二叉树(101. Symmetric Tree)

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 101. Symmetric Tree /**  * Definition for a binary tree no ...

  7. 【LeetCode 剑指offer刷题】数组题2:57 有序数组中和为s的两个数(167 Two Sum II - Input array is sorted)...

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 57 有序数组中和为s的两个数 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是 ...

  8. 【LeetCode 剑指offer刷题】字符串题6:67 把字符串转成整数

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 67 把字符串转成整数 题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符 ...

  9. 【LeetCode 剑指offer刷题】树题16:Kth Smallest Element in a BST

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) Kth Smallest Element in a BST Given a binary search tree, ...

最新文章

  1. Linux常用命令--echo
  2. matlab 着色算法,colorization_matlab着色 - 源码下载|图形图象|图形图像处理(光照,映射..)|源代码 - 源码中国...
  3. c c 语言程序设计同步,第一部分C语言程序设计C语言程序设计同步练习答案.PDF...
  4. CodeForces - 715A Plus and Square Root(思维+构造)
  5. 三星 P600 android,顶级硬件S pen笔手写—三星P600_三星 Galaxy Note 10.1 2014 Edition P600_平板电脑市场-中关村在线...
  6. JavaScript中九九乘法表制作
  7. c语言三个矩阵乘法,c语言矩阵相乘
  8. 操作系统与计算机组织基本知识(一)
  9. 华南联络易-管理培训老师的神助手
  10. JAVA 使用POI读取文档
  11. 【思考】冷启动、种子用户的获取和激活
  12. h20r1203功率管参数_电磁炉功率管H20R1353可以用H20R1203代换吗
  13. VMware安装树莓派(一)
  14. 怎么求最大公因数和最小公倍数
  15. Python实验报告 实验16 - Python计算生态
  16. 工作意向及规划个人建议
  17. 自动化立体仓库使用流程!海格里斯自动化立体库流程:入库——出库——拣选
  18. 【Workflow】5类经典科学工作流任务数统计
  19. Java版本便签纸小项目
  20. 企业cio(首席信息官)的职责

热门文章

  1. python大数据需要什么技术有前途_大数据就业前景好不好 一般要掌握哪些技术...
  2. 区块链技术要用到什么开发语言?
  3. Science:已“死亡”的细菌仍能感知来自环境的信息
  4. C语言入门:计算总成绩和平均成绩
  5. 2023年全国最新交安安全员精选真题及答案1
  6. uni-app 保存图片到本地相册
  7. Python 数据处理工具 Pandas(上)
  8. python opencv 入门 绘图函数 (3)
  9. MacOS Xcode与Swift版本对应关系
  10. Windows API 关于控件的自绘——文本颜色、背景颜色、字体