思维
sakura_is_the_best
这个作者很懒,什么都没留下…
展开
-
整数划分问题(HRBUST - 2004 ,OpenJ_Bailian-4149)
今天碰到了一道整数划分的题,想起以前也做过好几道这种题,于是就把这类问题总结下。 类型一:求将整数N分解成K个正整数的方案数(K个正整数不需要不同)。 dp[i][j]表示将i分解成j个正整数的方案数,考虑j个正整数中是否有1,如果有1,那么dp[i][j] = dp[i-1][j-1],相当于拿出一个1,剩余就是将i-1分成j-1个正整数的方案数。如果没有1,那么dp[i][j]=dp[i-j][j],相当于将i-j这个数分成j个正整数,然后将这个j个正整数都加上1就是将i这个数分成了j份。 综上,dp[原创 2020-11-22 16:51:51 · 281 阅读 · 0 评论 -
leetcode 952. 按公因数计算最大组件大小(质数筛+并查集)
给定一个由不同正整数的组成的非空数组 A,考虑下面的图: 有 A.length 个节点,按从 A[0] 到 A[A.length - 1] 标记; 只有当 A[i] 和 A[j] 共用一个大于 1 的公因数时,A[i] 和 A[j] 之间才有一条边。 返回图中最大连通组件的大小。 输入:[4,6,15,35] 输出:4 总结一下题目的意思,若a和b有一个大于1的公因数,则a和b属于1组,假如a和b一组,b和c一组,那么a和c也是一组。 很显然是一个并查集的题目,这题的关键是确定任意两个数是否属于一组,确定之原创 2020-11-10 21:28:21 · 276 阅读 · 0 评论 -
leetcode 47. 全排列 II(去重的两种思路)
给定一个可包含重复数字的序列,返回所有不重复的全排列。 示例: 输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ] 题目链接 如果不考虑去重,那么这道题就是一道非常基础的递归题目,比较基础。这里主要说一下去重的过程,去重的思想倒是不难想到,每一位每一种数字只能出现一次。 比如数组[1,1,2],递归时让第一位是1,然后第二位是1,第三位是2,一次递归完成没有问题,得到排列[1,1,2],于是保存答案进行回溯,回溯到第二位,让第二位为2,注意第二位是第一次出现了2,所以原创 2020-10-17 19:21:43 · 326 阅读 · 0 评论 -
牛客网 牛牛的mex(思维题)
题目链接 题意大体是有n个数,n个数都在0和n-1之中且不会重复,现在有n个查询,每个查询会提供一个区间,要求输出这个区间内没出现过的数中最小的那个。 由于n个数是在0到n-1之前且不会重复,那么在区间内没出现过的数字一定就会在区间外部出现,所以转换一下思路,不关注区间内没有什么数字,转而去关注区间外有什么数字,很容易发现,区间外出现过的最小的数字就是答案。 求区间外出现过的最小的数字用一个前缀最小值和一个后缀最小值就能解决,这题的关键是关注点从区间内转向区间外。 #include <bits/std原创 2020-09-04 17:27:41 · 240 阅读 · 0 评论 -
leetcode 面试题46. 把数字翻译成字符串(简单递归)
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。 示例 1: 输入: 12258 输出: 5 解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi” 提示: 0 <= num < 231 思路比较简单,组成字母最大的数字是25,也就是说最多只可以选两位拼成原创 2020-06-09 23:37:35 · 305 阅读 · 0 评论 -
leetcode 面试题 08.11. 硬币(完全背包求方案数以及转移方程通俗推导)
硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007) 示例1: 输入: n = 5 输出:2 解释: 有两种方式可以凑成总金额: 5=5 5=1+1+1+1+1 示例2: 输入: n = 10 输出:4 解释: 有四种方式可以凑成总金额: 10=10 10=5+5 10=5+1+1+1+1+1 10=1+...原创 2020-04-23 14:10:34 · 327 阅读 · 0 评论 -
leetcode 1248. 统计「优美子数组」
给你一个整数数组 nums 和一个整数 k。 如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。 请返回这个数组中「优美子数组」的数目。 示例 1: 输入:nums = [1,1,2,1,1], k = 3 输出:2 解释:包含 3 个奇数的子数组是 [1,1,2,1] 和 [1,2,1,1] 。 示例 2: 输入:nums = [2,4,6], k = 1 输...原创 2020-04-21 17:08:52 · 120 阅读 · 0 评论 -
leetcode 713. 乘积小于K的子数组(滑动窗口或二分)
给定一个正整数数组 nums。 找出该数组内乘积小于 k 的连续的子数组的个数。 示例 1: 输入: nums = [10,5,2,6], k = 100 输出: 8 解释: 8个乘积小于100的子数组分别为: [10], [5], [2], [6], [10,5], [5,2], [2,6], [5,2,6]。 需要注意的是 [10,5,2] 并不是乘积小于100的子数组。 需要注意到数组内每一...原创 2020-04-21 15:07:46 · 235 阅读 · 0 评论 -
leetcode 466. 统计重复个数(寻找循环节)
由 n 个连接的字符串 s 组成字符串 S,记作 S = [s,n]。例如,[“abc”,3]=“abcabcabc”。 如果我们可以从 s2 中删除某些字符使其变为 s1,则称字符串 s1 可以从字符串 s2 获得。例如,根据定义,“abc” 可以从 “abdbec” 获得,但不能从 “acbbe” 获得。 现在给你两个非空字符串 s1 和 s2(每个最多 100 个字符长)和两个整数 0 ≤ ...原创 2020-04-19 18:10:23 · 214 阅读 · 0 评论 -
leetcode 45. 跳跃游戏 II(java线段树或者贪心)
给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 你的目标是使用最少的跳跃次数到达数组的最后一个位置。 示例: 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2。 从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。 说明: 假设你总是可以到达数组的最后一个位置。 一.贪...原创 2020-04-17 19:48:08 · 222 阅读 · 1 评论 -
leetcode11. 盛最多水的容器
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 说明:你不能倾斜容器,且 n 的值至少为 2。 思维题,如果直接暴力,那么就是N平方的复杂度,写起来也简单,双重循环跑一遍即可。 但是平方的复杂度太高了...原创 2020-04-16 18:06:28 · 99 阅读 · 0 评论 -
leetcode 198. 打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。 示例 1: 输入: [1,2,3,1] 输出: 4 解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号...原创 2020-01-07 22:07:36 · 116 阅读 · 0 评论 -
leetcode 238. 除自身以外数组的乘积
给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。 示例: 输入: [1,2,3,4] 输出: [24,12,8,6] 说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。 思路一:用了除法,其实不满足题意,注意要考虑0的情况,否则会出现0/0的情况,特判一下0...原创 2020-01-07 21:42:59 · 86 阅读 · 0 评论 -
leetcode 152. 乘积最大子序列
给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 示例 2: 输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。 dp,max[i]代表以i为结尾的最大字串乘积和,min[i]代表以i为结尾的最小字串乘积和。...原创 2020-01-07 21:14:31 · 102 阅读 · 0 评论 -
EOJ 3338 双塔问题
单点时限: 1.0 sec 内存限制: 256 MB Alice 和 Bob 在玩积木游戏。 他们找到了 n 块积木,这些积木都是正方体,棱长分别为 a1,a2,…,an。现在 Alice 和 Bob 要用这些积木垒两座高塔。他们想要这两座高塔的高度相等。问最大高度可能是多少? 摆放积木的顺序没有要求。两座高塔不能公用积木。 输入格式 第一行一个整数 n 。 第二行 n 个整数,用空格隔开,分别是...原创 2020-01-01 17:18:02 · 515 阅读 · 0 评论 -
51nod1275 连续子段的差异(单调队列)
给出一个包括N个元素的整数数组A,包括A本身在内,共有 (N+1)*N / 2个非空子段。例如:1 3 2的子段为{1} {3} {2} {1 3} {3 2} {1 3 2}。在这些子段中,如果最大值同最小值的差异不超过K,则认为这是一个合格的子段。给出数组A和K,求有多少符合条件的子段。例如:3 5 7 6 3,K = 2,符合条件的子段包括:{3} {5} {7} {6} {3} {3 5}...原创 2018-10-19 11:16:04 · 178 阅读 · 0 评论 -
EOJ 3562 monthly 2018.5 面向对象程序设计(离线处理+栈)
在面向对象程序设计中,常常会运用到函数的扩展与重写。当一个类继承某个类的时候,它可以调用所有父类可以调用的函数。它可以声明新的函数。当新的函数签名与父类的某个函数一致时,就会发生函数的覆盖(重写)。所以,在子类的实例调用某个函数时,它会调用最近的父类(有可能是它自己)的那个函数实现。 这里我们不考虑访问权限等情况,我们只关心某个类在调用某个函数时,这个函数是在哪个类中实现的。 中文题题意略。。...原创 2018-05-12 23:09:43 · 353 阅读 · 0 评论