
剑指offer
小王子y
互关啊!!
展开
-
剑指Offer 骰子的点数(线性DP和DFS两种解法)
将一个骰子投掷 n 次,获得的总点数为 s,s 的可能范围为 n∼6n。掷出某一点数,可能有多种掷法,例如投掷 2 次,掷出 3 点,共有 [1,2],[2,1][ 两种掷法。请求出投掷 n 次,掷出 n∼6n 点分别有多少种掷法。样例1输入:n=1输出:[1, 1, 1, 1, 1, 1]解释:投掷1次,可能出现的点数为1-6,共计6种。每种点数都只有1种掷法。所以输出[1, 1, 1, 1, 1, 1]。样例2输入:n=2输出:[1, 2, 3, 4, 5, 6, 5, 4, 3原创 2021-03-12 00:10:08 · 188 阅读 · 0 评论 -
剑指Offer 数字排列(DFS)
输入一组数字(可能包含重复数字),输出其所有的排列方式。样例输入:[1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]输入 [1,1,2]输出[[1, 1, 2], [1, 2, 1], [2, 1, 1]]class Solution {public: vector原创 2021-02-12 23:04:05 · 205 阅读 · 0 评论 -
剑指Offer 不分行从上往下打印二叉树
从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。样例输入如下图所示二叉树[8, 12, 2, null, null, 6, null, 4, null, null, null] 8 / \ 12 2 / 6 / 4输出:[8, 12, 2, 6, 4]/** * Definition for a binary tree node. * struct TreeNode { * int val; * Tree原创 2021-01-28 19:03:54 · 82 阅读 · 0 评论 -
剑指Offer 数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。假设数组非空,并且一定存在满足条件的数字。思考题:假设要求只能使用 O(n) 的时间和额外 O(1) 的空间,该怎么做呢?样例输入:[1,2,1,1,3]输出:1class Solution {public: int moreThanHalfNum_Solution(vector<int>& nums) { int cnt=0,val=-1; for(auto x:n原创 2021-01-28 00:37:23 · 117 阅读 · 0 评论 -
剑指Offer 礼物的最大价值(线性DP)
在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?注意:m,n>0样例:输入:[ [2,3,1], [1,7,1], [4,6,1]]输出:19解释:沿着路径 2→3→7→6→1 可以得到拿到最大价值礼物。class Solution {public: int getMa原创 2021-01-27 23:45:42 · 71 阅读 · 0 评论 -
剑指Offer 二进制中1的个数
输入一个32位整数,输出该数二进制表示中1的个数。注意:负数在计算机中用其绝对值的补码来表示。样例1输入:9输出:2解释:9的二进制表示是1001,一共有2个1。样例2输入:-2输出:31解释:-2在计算机里会被表示成11111111111111111111111111111110, 一共有31个1。class Solution {public: int NumberOf1(int n) { int res=0; while(n)原创 2021-01-27 23:24:09 · 143 阅读 · 1 评论 -
剑指Offer 股票的最大利润(贪心)
假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖 一次 该股票可能获得的利润是多少?例如一只股票在某些时间节点的价格为[9, 11, 8, 5, 7, 12, 16, 14]。如果我们能在价格为5的时候买入并在价格为16时卖出,则能收获最大的利润11。样例输入:[9, 11, 8, 5, 7, 12, 16, 14]输出:11//暴力class Solution {public: int maxDiff(vector<int>& nums) {原创 2021-01-26 22:21:20 · 136 阅读 · 0 评论 -
剑指Offer 把数组排成最小的数(贪心)
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组[3, 32, 321],则打印出这3个数字能排成的最小数字321323。样例输入:[3, 32, 321]输出:321323注意:输出数字的格式为字符串。class Solution {public: static bool cmp(string a, string b) { return a + b < b + a; }原创 2021-01-26 21:53:39 · 127 阅读 · 0 评论 -
剑指Offer 连续子数组的最大和(dp,贪心)
输入一个 非空 整型数组,数组里的数可能为正,也可能为负。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。样例输入:[1, -2, 3, 10, -4, 7, 2, -5]输出:18class Solution {public: int maxSubArray(vector<int>& nums) { int res=-1e9; vector<int>dp(nums.si原创 2021-01-26 21:34:29 · 106 阅读 · 0 评论 -
剑指Offer 旋转数组的最小数字(二分)
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个升序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。数组可能包含重复项。注意:数组内所含元素非负,若数组大小为0,请返回-1。样例输入:nums=[2,2,2,0,1]输出:0class Solution {public: int findMin(vector<int>& nums) { i原创 2021-01-16 17:20:29 · 90 阅读 · 0 评论 -
剑指Offer 机器人的运动范围(BFS)
地上有一个 m 行和 n 列的方格,横纵坐标范围分别是 0∼m−1 和 0∼n−1。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格。但是不能进入行坐标和列坐标的数位之和大于 k 的格子。请问该机器人能够达到多少个格子?样例1输入:k=7, m=4, n=5输出:20样例2输入:k=18, m=40, n=40输出:1484解释:当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。 但是,它不能进入方格(35,38),原创 2021-01-10 23:34:03 · 104 阅读 · 0 评论 -
矩阵中的路径(DFS)
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。注意:输入的路径不为空;所有出现的字符均为大写英文字母;样例matrix=[ ["A","B","C","E"], ["S","F","C","S"], ["A","D","E","E"]]str="BCCE" , return "true"原创 2021-01-08 01:29:53 · 216 阅读 · 0 评论