当前位置:网站首页>剑指 Offer II 092. 翻转字符 / 剑指 Offer II 093. 最长斐波那契数列
剑指 Offer II 092. 翻转字符 / 剑指 Offer II 093. 最长斐波那契数列
2022-06-23 17:23:00 【彼淇梁】
剑指 Offer II 092. 翻转字符【中等题】
思路:【动态规划】
二阶dp数组dp[i][0]表示将第i位翻转为0后,数组保持递增的最小翻转次数dp[i][1]表示将第i位翻转为1后,数组保持递增的最小翻转次数
初始状态:dp[0][0] = s.charAt(0) == '0' ? 0 : 1dp[0][1] = s.charAt(0) == '1' ? 0 : 1
转移方程:
dp[i][0] = dp[i-1][0]+s.charAt(i) == '0' ? 0:1dp[i][1] = Math.min(dp[i-1][0],dp[i-1][1])+s.charAt(i) == '1' ? 0:1
代码:【dp数组】
class Solution {
public int minFlipsMonoIncr(String s) {
//动态规划解题
int n = s.length();
//dp二维数组
// dp[i][0]表示将第i位翻转为0时,使字符串s单调递增的最小翻转次数,此时i-1处的字符必须为0
// dp[i][1]表示将第i位翻转为1时,使字符串s单调递增的最小翻转次数,此时i-1处的字符可以为0也可以为1
int[][] dp = new int[n][2];
dp[0][0] = s.charAt(0) == '0' ? 0 : 1;//第0位字符为0,则dp[0][0]=0,否则为1
dp[0][1] = s.charAt(0) == '1' ? 0 : 1;//第0位字符为1,则dp[0][1]=0,否则为1
for (int i = 1; i < n; i++) {
int k1 = 0,k2 = 0;
if (s.charAt(i) == '0'){
k2++;
}else {
k1++;
}
//将第i位翻转为0的最小翻转次数 为 dp[i-1][0] + (s[i] == ‘1’ ? 1 : 0)
dp[i][0] = dp[i-1][0] + k1;
//将第i位翻转为1的最小翻转次数 为 Math.min(dp[i-1][0],dp[i-1[1]) + (s[i] == '0' ? 1 : 0)
dp[i][1] = Math.min(dp[i-1][0],dp[i-1][1]) + k2;
}
//最后返回将第n-1位翻转为0或者翻转为1的较小值
return Math.min(dp[n-1][0],dp[n-1][1]);
}
}
代码:【滚动数组】
class Solution {
public int minFlipsMonoIncr(String s) {
//动态规划解题
int n = s.length();
//滚动数组模拟dp数组
// dp0表示将第i位翻转为0时,使字符串s单调递增的最小翻转次数,此时i-1处的字符必须为0
// dp1表示将第i位翻转为1时,使字符串s单调递增的最小翻转次数,此时i-1处的字符可以为0也可以为1
int dp0 = s.charAt(0) == '0' ? 0 : 1;//第0位字符为0,则dp[0][0]=0,否则为1
int dp1 = s.charAt(0) == '1' ? 0 : 1;//第0位字符为1,则dp[0][1]=0,否则为1
for (int i = 1; i < n; i++) {
int k1 = 0,k2 = 0;
if (s.charAt(i) == '0'){
k2++;
}else {
k1++;
}
//将第i位翻转为0的最小翻转次数 为 dp[i-1][0] + (s[i] == ‘1’ ? 1 : 0)
k1 += dp0;
//将第i位翻转为1的最小翻转次数 为 Math.min(dp[i-1][0],dp[i-1[1]) + (s[i] == '0' ? 1 : 0)
k2 += Math.min(dp0,dp1);
dp0 = k1;
dp1 = k2;
}
//最后返回将第n-1位翻转为0或者翻转为1的较小值
return Math.min(dp0,dp1);
}
}
剑指 Offer II 093. 最长斐波那契数列【中等题】
思路:【动态规划】【双指针】
参考题解
动态规划+双指针,就是快!
代码:
class Solution {
public int lenLongestFibSubseq(int[] arr) {
int n = arr.length,max = 0;
//dp[i][j]为arr数组中以下标 i j 位置的数字为结尾的合法斐波那契数列,dp[i][j]的值表示所表示的斐波那契数列的长度
int[][] dp = new int[n][n];
//遍历数组,以遍历到的数字arr[k]为目标合法斐波那契数列子序列的结束位置
for (int k = 2; k < n; k++) {
//定义双指针 i 和 j 其中 i表示目标合法斐波那契数列子序列的起始位置,初值为 0,j表示目标合法斐波那契数列子序列结束位置的前一位,初值为 k-1
int i = 0, j = k-1;
//当 i < j 时,在[i,j]窗口内筛选是否存在 目标合法斐波那契数列子序列
while (i < j){
//当 arr[i] + arr[j] == arr[k]时,说明找到了一个以 j k 位置数字结束的合法斐波那契数列(这里简写为jk目标)
if (arr[i] + arr[j] == arr[k]){
//如果 dp[i][j] == 0 表示以 i j 位置数字结束的所有子序列无法构成合法斐波那契数列,所以 jk目标的长度只能是 3
if (dp[i][j] == 0){
dp[j][k] = 3;
}else {
//否则 jk目标的长度等于 ij目标的长度+1 与 jk目标的长度 两者之间的最大值
dp[j][k] = Math.max(dp[i][j]+1,dp[j][k]);
}
//此时更新max为 max 和 jk目标长度 两者之间的最大值
max = Math.max(max,dp[j][k]);
//i指针右移 j指针左移 继续在窗口内寻找合法斐波那契数列子序列
i++;
j--;
}else if (arr[i] + arr[j] < arr[k]){
//当 arr[i] + arr[j] < arr[k]时,根据arr递增的这一性质,为了使 arr[i] + arr[j] ==> arr[k],我们应该尝试右移i,然后重新判断
i++;
}else {
//当 arr[i] + arr[j] > arr[k]时,根据arr递增的这一性质,为了使 arr[i] + arr[j] ==> arr[k],我们应该尝试左移j,然后重新判断
j--;
}
}
}
//程序执行过程中,max保持始终是 合法斐波那契数列长度的最大值,因此根据题意程序结束时返回max即可
return max;
}
}
边栏推荐
- QML type: Loader
- Dive into deep learning - 1. Introduction
- Call face recognition exception
- Reading papers (51):integration of a holonic organizational control architecture and multiobjective
- 论文阅读 (49):Big Data Security and Privacy Protection (科普文)
- 【Unity】插件TextAnimator 新手使用说明
- Wiley-中国科学院文献情报中心开放科学联合研讨会第二讲:开放获取期刊选择及论文投稿...
- 12. Manage network environment
- How to make towel washing label
- 3000帧动画图解MySQL为什么需要binlog、redo log和undo log
猜你喜欢

leetcode刷题:哈希表06 (赎金信)

提高效率 Or 增加成本,开发人员应如何理解结对编程?

Crmeb second open SMS function tutorial

【Unity】插件TextAnimator 新手使用说明

Imeta | Nannong shenqirong team released microbial network analysis and visualization R package ggclusternet

"Tribute to a century old master, collect pocket book tickets"
![Wechat applet reports an error [app.json file content error] app json: app. JSON not found](/img/ab/5c27e1bb80ad662d1a220d29c328e0.png)
Wechat applet reports an error [app.json file content error] app json: app. JSON not found

Alien world, real presentation, how does the alien version of Pokemon go achieve?

Redis 集群

【Wwise】Wwise嵌入Unity后打包出现没有声音问题
随机推荐
[unity] instructions for beginners of textanimator plug-in
计算机学院改考后,网络空间安全学院也改考了!南京理工大学计算机考研
Goframe framework: graceful closing process
[sword finger offer] 46 Translate numbers into strings
[Hyperf]Entry “xxxInterface“ cannot be resolved: the class is not instantiable
iMeta | 南农沈其荣团队发布微生物网络分析和可视化R包ggClusterNet
一,数组--滑动窗口问题--长度最小的子数组--水果成篮问题
CRMEB 二开短信功能教程
README
Counter attack and defense (2): counter strategy against samples
Torch learning (I): environment configuration
Strong cache and negotiation cache in http
13. IP address and subnet partitioning (VLSM)
对抗攻击与防御 (2):对抗样本的反制策略
Kdevtmpfsi processing of mining virus -- Practice
2022年T电梯修理考试题库及模拟考试
[esp8266-01s] get weather, city, Beijing time
对抗攻击与防御 (1):图像领域的对抗样本生成
Paper reading (55):dynamic multi robot task allocation under uncertainty and temporary constraints
Redis cluster