当前位置: 首页 > news >正文

【左神算法刷题班】第17节:在有序二维数组中查找目标值、等于目标字符串的子序列个数

第17节

题目1:在有序二维数组中查找目标值

给定一个每一行有序、每一列也有序,整体可能无序的二维数组

再给定一个数num,

返回二维数组中有没有num这个数

例子

数组如下,找 6 是否存在。

1  3  5  7
2  4  6  13
3  9  14 14
思路

力扣上做过原题。

从左下角开始,向右上角走。如果当前小于 target,则向右走。如果当前大于 target,则向上走。

题目2:

给定一个每一行有序、每一列也有序,整体可能无序的二维数组

在给定一个正数k,

返回二维数组中,整体第 k 小的数

Leetcode原题:

https://leetcode.com/problems/kth-smallest-element-in-a-sorted-matrix/

思路
1  3  5  7
2  4  6  13
3  9  14 14

假设我先任意选一个数字10,想要求出所有小于10的数有多少个。从右上角向左下角走,如果当前数小于10,就往下走(此时当前位置左方全是小于10的数),如果大于10,就往左走。沿途通过下标计算,累加所有小于10的数,假设有m个。

根据上述方式,我可以知道小于某个数字的数有多少个。

而整体来看,我知道整个数组最小值是左上角的 min,最大值是右下角的 max,这样我就可以通过二分查找的方式,让 mid=min+(max-min)/2,求出比 mid 小的数有 m 个,如果 m < k,就让 max = mid 继续二分;否则如果 m>k,让 min = mid 继续二分。

如果最后得到答案是 res,而整个数组中没有 res 这个数字,你需要找到距离 res 最近,并且比 res 小的数。

题目3

Leetcode原题:

https://leetcode.com/problems/palindrome-pairs/

在这里插入图片描述

题目4:等于目标字符串的子序列个数(DP)

给定两个字符串S和T

返回S的所有子序列中

有多少个子序列的字面值等于T

思路

样本对应模型,可能性根据结尾字符来划分。

假设S的长度为i,T的长度为j,则 dp[i][j] 表示:从 S 序列 [0…i] 范围上随便选,有多少个子序列的字面值等于 T[0…j] 这个前缀字符串。

dp 表的右下角,就表示了 S 整体字符串有多少个子序列的字面值等于 T 字符串。

状态怎么转移?当我来到 dp[i][j] 的时候,

  • 可能性1:不使用 i 位置的字符,则 dp[i][j] = dp[i-1][j]
  • 可能性2:只有在 S[i] == T[j] 的情况下才可以,使用 S 字符串 i 位置的字符来匹配 T 字符串 j 位置的字符,则 dp[i][j] = dp[i-1][j-1]

考虑上述两种可能性,相加,得到 dp[i][j] = dp[i-1][j] + dp[i-1][j-1]

public static int dp(String S, String T) {char[] s = S.toCharArray();char[] t = T.toCharArray();int N = s.length;int M = t.length;int[][] dp = new int[N][M];// s[0..0] T[0..0] dp[0][0]dp[0][0] = s[0] == t[0] ? 1 : 0;for (int i = 1; i < N; i++) {dp[i][0] = s[i] == t[0] ? (dp[i - 1][0] + 1) : dp[i - 1][0];}for (int i = 1; i < N; i++) {for (int j = 1; j <= Math.min(i, M - 1); j++) {dp[i][j] = dp[i - 1][j];if (s[i] == t[j]) {dp[i][j] += dp[i - 1][j - 1];}}}return dp[N - 1][M - 1];
}

题目5

给定一个字符串Str

返回Str的所有子序列中有多少不同的字面值

Leetcode原题:

https://leetcode.com/problems/distinct-subsequences-ii/

思路

主要是观察规律。

在这里插入图片描述

题目6

给定一个数组arr,长度为N,arr中的值只有1,2,3三种
arr[i] == 1,代表汉诺塔问题中,从上往下第i个圆盘目前在左
arr[i] == 2,代表汉诺塔问题中,从上往下第i个圆盘目前在中
arr[i] == 3,代表汉诺塔问题中,从上往下第i个圆盘目前在右
那么arr整体就代表汉诺塔游戏过程中的一个状况
如果这个状况不是汉诺塔最优解运动过程中的状况,返回-1
如果这个状况是汉诺塔最优解运动过程中的状况,返回它是第几个状况

题目7

Leetcode 原题:

https://leetcode.com/problems/shortest-bridge/

http://www.lryc.cn/news/123917.html

相关文章:

  • 【Terraform学习】本地变量(Terraform配置语言学习)
  • zabbix自动注册服务器以及部署代理服务器
  • 掌握Python的X篇_32_使用python编辑pdf文件_pdfrw
  • 【软件工程】软件测试
  • Android性能优化——内存优化
  • Android Studio实现图形验证码
  • JAVA面试数据库篇
  • Android高手进阶教程(三)之----Android 中自定义View的应用.
  • 第一百一十三回 dart中的getter/setter方法
  • 搭建Docker环境
  • 微服务08-多级缓存
  • Intel汇编和ATT汇编的区别?
  • MongoDB 备份与恢复
  • 探讨uniapp的网络通信问题
  • 【左神算法刷题班】第18节:汉诺塔问题、岛屿问题、最大路径和问题
  • 网络安全体系架构介绍
  • JSP实训项目设计报告—MVC简易购物商城
  • 41、可靠传输——停等ARQ
  • RK3568 cmake编译
  • 详细安装配置django
  • HTTP之cookie基础学习
  • 观察者模式和发布订阅模式
  • 利用ViewModel和LiveData进行数据管理
  • 前后端分离------后端创建笔记(05)用户列表查询接口(下)
  • 浅谈GIS和三维GIS的区别?
  • ArcGIS Maps SDK for JavaScript系列之三:在Vue3中使用ArcGIS API加载三维地球
  • 设计列表和超链接
  • rust包跨平台编译,macbook ,linux
  • JAVA集合-List
  • Python|OpenCV-绘制图形和添加文字的方法(2)