当前位置:网站首页>剑指 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;
}
}
边栏推荐
- 【華中科技大學】考研初試複試資料分享
- 建立自己的网站(13)
- csdn涨薪秘籍之Jenkins集成allure测试报告全套教程
- Latex编译成功但是无法输出到PDF
- 计算机学院改考后,网络空间安全学院也改考了!南京理工大学计算机考研
- Dive into deep learning - 1. Introduction
- Alien world, real presentation, how does the alien version of Pokemon go achieve?
- 2022年在网上办理股票开户安全吗?
- Kotlin practical skills you should know
- 异步or线程池
猜你喜欢

Paper reading (56):muti features predction of protein translational modification sites (task)

【ESP8266-01s】獲取天氣,城市,北京時間

Reading papers (51):integration of a holonic organizational control architecture and multiobjective
![[esp8266-01s] get weather, city, Beijing time](/img/8f/89e6f0d482f482ed462f1ebd53616d.png)
[esp8266-01s] get weather, city, Beijing time

Redis Cluster

Wechat applet startlocationupdatebackground() simply realizes rider distribution location

csdn涨薪秘籍之Jenkins集成allure测试报告全套教程

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

科技互动沙盘是凭借什么收获人气的

TT 语音落地 Zadig:开源共创 Helm 接入场景,环境治理搞得定!
随机推荐
Async/await
提高效率 Or 增加成本,开发人员应如何理解结对编程?
论文阅读 (49):Big Data Security and Privacy Protection (科普文)
【Unity】插件TextAnimator 新手使用说明
6 steps to teach you financial data mining preprocessing
Kerberoasting without SPN
A set of code to launch seven golang web frameworks at the same time
Nodejs implements multi process
leetcode刷题:哈希表06 (赎金信)
Troubleshooting and modification process of easycvr interface dislocation in small screen
正则表达式使用图床
Paper reading (50):a novel matrix game with payoffs of maximal belt structure
esp8266-01s 不能连接华为路由器解决方法
论文阅读 (52):Self-Training Multi-Sequence Learning with Transformer for Weakly Supervised Video Anomaly
Regular expression use graph bed
[unity] instructions for beginners of textanimator plug-in
[learning notes] tidb learning notes (III)
【剑指Offer】45. 把数组排成最小的数
暂停更新公告—行走的皮卡丘
如何利用好每天的时间高效复习?