2022-07-07:原本数组中都是大于0、小于等于k的数字,是一个单调不减的数组,
其中可能有相等的数字,总体趋势是递增的。
但是其中有些位置的数被替换成了0,我们需要求出所有的把0替换的方案数量:
1)填充的每一个数可以大于等于前一个数,小于等于后一个数;
2)填充的每一个数不能大于k。
来自腾讯音乐。

答案2022-07-07:

方法一:动态规划。
方法二:数学方法。用到组合,C(b-a+m,m)。

代码用rust编写。代码如下:

  1. use rand::Rng;
  2. fn main() {
  3. let nn: i64 = 20;
  4. let kk: i64 = 30;
  5. let test_time: i32 = 10000;
  6. println!("测试开始");
  7. for i in 0..test_time {
  8. let n = rand::thread_rng().gen_range(0, nn) + 1;
  9. let k = rand::thread_rng().gen_range(0, kk) + 1;
  10. let mut arr = random_array(n, k);
  11. let ans1 = ways1(&mut arr, k);
  12. let ans2 = ways2(&mut arr, k);
  13. if ans1 != ans2 {
  14. println!("出错了!{}", i);
  15. println!("ans1 = {}", ans1);
  16. println!("ans2 = {}", ans2);
  17. break;
  18. }
  19. }
  20. println!("测试结束");
  21. }
  22. // 动态规划
  23. fn ways1(nums: &mut Vec<i64>, k: i64) -> i64 {
  24. let n = nums.len() as i64;
  25. // dp[i][j] : 一共i个格子,随意填,但是不能降序,j种数可以选
  26. let mut dp: Vec<Vec<i64>> = vec![];
  27. for i in 0..n + 1 {
  28. dp.push(vec![]);
  29. for _ in 0..k + 1 {
  30. dp[i as usize].push(0);
  31. }
  32. }
  33. for i in 1..=n {
  34. dp[i as usize][1] = 1;
  35. }
  36. for i in 1..=k {
  37. dp[1][i as usize] = i;
  38. }
  39. for i in 2..=n {
  40. for j in 2..=k {
  41. dp[i as usize][j as usize] =
  42. dp[(i - 1) as usize][j as usize] + dp[i as usize][(j - 1) as usize];
  43. }
  44. }
  45. let mut res = 1;
  46. let mut i: i64 = 0;
  47. let mut j: i64 = 0;
  48. while i < nums.len() as i64 {
  49. if nums[i as usize] == 0 {
  50. j = i + 1;
  51. while j < nums.len() as i64 && nums[j as usize] == 0 {
  52. j += 1;
  53. }
  54. let left_value = if i - 1 >= 0 {
  55. nums[(i - 1) as usize]
  56. } else {
  57. 1
  58. };
  59. let right_value = if j < nums.len() as i64 {
  60. nums[j as usize]
  61. } else {
  62. k
  63. };
  64. res *= dp[(j - i) as usize][(right_value - left_value + 1) as usize];
  65. i = j;
  66. }
  67. i += 1;
  68. }
  69. return res;
  70. }
  71. // 数学方法
  72. // a ~ b范围的数字随便选,可以选重复的数,一共选m个
  73. // 选出有序序列的方案数:C ( m, b - a + m )
  74. fn ways2(nums: &mut Vec<i64>, k: i64) -> i64 {
  75. let mut res = 1;
  76. let mut i: i64 = 0;
  77. let mut j: i64 = 0;
  78. while i < nums.len() as i64 {
  79. if nums[i as usize] == 0 {
  80. j = i + 1;
  81. while j < nums.len() as i64 && nums[j as usize] == 0 {
  82. j += 1;
  83. }
  84. let left_value = if i - 1 >= 0 {
  85. nums[(i - 1) as usize]
  86. } else {
  87. 1
  88. };
  89. let right_value = if j < nums.len() as i64 {
  90. nums[j as usize]
  91. } else {
  92. k
  93. };
  94. let numbers = j - i;
  95. res *= c(right_value - left_value + numbers, numbers);
  96. i = j;
  97. }
  98. i += 1;
  99. }
  100. return res;
  101. }
  102. // 从一共a个数里,选b个数,方法数是多少
  103. fn c(a: i64, b: i64) -> i64 {
  104. if a == b {
  105. return 1;
  106. }
  107. let mut x = 1;
  108. let mut y = 1;
  109. let mut i = b + 1;
  110. let mut j = 1;
  111. while i <= a {
  112. x *= i;
  113. y *= j;
  114. let gcd = gcd(x, y);
  115. x /= gcd;
  116. y /= gcd;
  117. i += 1;
  118. j += 1;
  119. }
  120. return x / y;
  121. }
  122. fn gcd(m: i64, n: i64) -> i64 {
  123. if n == 0 {
  124. m
  125. } else {
  126. gcd(n, m % n)
  127. }
  128. }
  129. // 为了测试
  130. fn random_array(n: i64, k: i64) -> Vec<i64> {
  131. let mut ans: Vec<i64> = vec![];
  132. for _i in 0..n {
  133. ans.push(rand::thread_rng().gen_range(0, k) + 1);
  134. }
  135. ans.sort();
  136. for i in 0..n {
  137. ans[i as usize] = if rand::thread_rng().gen_range(0, 2) == 0 {
  138. 0
  139. } else {
  140. ans[i as usize]
  141. };
  142. }
  143. return ans;
  144. }

执行结果如下:


左神java代码

2022-07-07:原本数组中都是大于0、小于等于k的数字,是一个单调不减的数组, 其中可能有相等的数字,总体趋势是递增的。 但是其中有些位置的数被替换成了0,我们需要求出所有的把0替换的方案数量:的更多相关文章

  1. word文档巧替换(空行替换、空格替换、软回车替换成硬回车)

    一.空行替换 在日常工作中,我们经常从网上下载一些文字材料,往往因空行多使得页数居高不下.一般方法是:在“编辑”菜单中打开“查找和替换”对话框(或按ctrl+H),在“查找内容”中输入“^p^p”“替 ...

  2. sql server的sql 语句中的列名包含[]时候,把]替换成]]就可以

    sql server的sql 语句中的列名包含[]时候,把]替换成]]就可以eg: create table p.e_LOG_WebServer ( [BSCFlg] int, ), ) ); sel ...

  3. 4.写一个控制台应用程序,接收一个长度大于3的字符串,完成下列功能: 1)输出字符串的长度。 2)输出字符串中第一个出现字母a的位置。 3)在字符串的第3个字符后面插入子串“hello”,输出新字符串。 4)将字符串“hello”替换为“me”,输出新字符串。 5)以字符“m”为分隔符,将字符串分离,并输出分离后的字符串。 */

    namespace test4 {/* 4.写一个控制台应用程序,接收一个长度大于3的字符串,完成下列功能: 1)输出字符串的长度. 2)输出字符串中第一个出现字母a的位置. 3)在字符串的第3个字符 ...

  4. JavaScript中将对象数组中的某个属性值,批量替换成另一个数值

    原文链接 https://segmentfault.com/q/1010000010352622 希望将下列数组中的sh替换成沪,sz替换成深 var stooges = [ {label:1,val ...

  5. 10、数组a和b各有10个元素。将他们相同的位置元素逐个比较, 如果a中元素大于b中对应元素的次数多于b数组中元素大于a中元素的次数, 则认为a大于b。请统计大于等于小于的次数

    /* 数组a和b各有10个元素.将他们相同的位置元素逐个比较, 如果a中元素大于b中对应元素的次数多于b数组中元素大于a中元素的次数, 则认为a大于b.请统计大于等于小于的次数 */ #include ...

  6. PHP将部分内容替换成星号

    在最近的项目中,会碰到到某人的手机号码隐藏中间几位,身份证号码只显示末尾4位的需求.当时一开始是网上搜索了一下,看到有人是用substr_replace这个函数来替换的,后面我也用了这个函数,但在用的 ...

  7. 《剑指offer面试题4》替换空格——实现函数把字符串中每个空格替换成“%20”

    思路: 例如把we are happy这个字符串中所有空格替换成"%20",最直接的做法是从头开始扫苗,遇到空格就替换,并且把空格后面的字符都顺序后移.复杂度O(n^2). 重要思 ...

  8. 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

    一.题目描述 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 二.解题思路 1)简单暴力解法 ...

  9. 坑爹的PostgreSQL的美元符号(有时需要替换成单引号)

    今天想在PostgeSQL数据库里建一个存储过程(或函数也行),由于对存储过程比较生疏,上网搜了很多教程和源代码例子,照着写,发现怎么都不行,甚至把网上教程包括官方教程的源代码原封不动的复制下来一执行 ...

  10. Python 实现将numpy中的nan和inf,nan替换成对应的均值

    nan:not a number inf:infinity;正无穷 numpy中的nan和inf都是float类型     t!=t 返回bool类型的数组(矩阵) np.count_nonzero( ...

随机推荐

  1. python 中倒是什么事可哈希的意思那?

    可哈希对象 python中的hashable(可哈希的)是什么意思 2018年12月29日 23:29:36 shangyj17 阅读数:511   不严谨但易懂的解释: 一个对象在其生命周期内,如果 ...

  2. 记一个快捷在线接口YAPI

    在线地址:http://192.168.252.152:3000 1.idea中file下setting中plugins搜索并加载插件YAPI 2.idea中的.idea中.misc.xml文件配置. ...

  3. Pycharm 搭建 Django 项目

    1. 安装需求 在使用 python 框架 Django 需要注意下面事项 Pycharm 版本是专业版而不是社区版本 Pycharm 配置好了 python 解释器 (一般我们现在用的都是pytho ...

  4. 中高等DP总结(更新中

    1.CF613D Kingdom and its Cities 题意:给定一棵树,每个询问给出一些关键点,要求删掉最少的点使这些点两两不联通,无解输出-1. 思路:先判无解:只要有一个关键点的父亲也是 ...

  5. java 面向对象 --static

    java 面向对象 --static package charpter5.Demo09; //static public class Student { private static int age; ...

  6. ThreadLocal部分源码分析和应用场景

    结构演进 早起JDK版本中,ThreadLocal内部结构是一个Map,线程为key,线程在"线程本地变量"中绑定的值为Value.每一个ThreadLocal实例拥有一个Map实 ...

  7. Spring配置类为什么要分Full和Lite模式

    本文基于Spring 5.2.15-RELEASE 关于Spring配置类的Full模式和Lite模式,如果没有仔细阅读过源码或者官方文档的话,估计很多人都不知道这个概念.所以我们先来解释下这两个概念 ...

  8. $\mathcal{Friends\,\,Of\,--Mathic}$

  9. 使用frp进行内网穿透

    frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP.UDP.HTTP.HTTPS 等多种协议.可以将内网服务以安全.便捷的方式通过具有公网 IP 节点的中转暴露到公网. frp is a ...

  10. mysql数据类型精讲

    1.MySQL中的数据类型 常见数据类型的属性,如下: 2.整数类型2.1 类型介绍整数类型一共有 5 种,包括 TINYINT.SMALLINT.MEDIUMINT.INT(INTEGER)和 BI ...