LeetCode.944-删除列保证排序(Delete Columns to Make Sorted)
这是悦乐书的第362次更新,第389篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第224题(顺位题号是944)。我们给出了一个N个小写字母串的数组A,它们的长度都相同。
现在,我们可以选择任何一组删除索引,对于每个字符串,我们删除这些索引中的所有字符。
例如,如果我们有一个数组A = [“abcdef”,“uvwxyz”]和删除索引{0,2,3},那么删除后的数组变成了[“bef”,“vyz”],纵向上看,每一列是[“b”,“v”],[“e”,“y”]和[“f”,“z”]。(形式上,第c列是[A[0][c],A[1][c],...,A[A.length-1][c]]。)
假设我们选择了一组删除索引D,使得在删除之后,A中的每个剩余列都处于递增排序顺序。返回D.length的最小可能值。例如:
输入:[“cba”,“daf”,“ghi”]
输出:1
说明:在选择D = {1}之后,每列[“c”,“d”,“g”]和[“a”,“f”,“i”]处于递增的排序顺序。如果我们选择D = {},则列[“b”,“a”,“h”]将不是递增排序顺序。
输入:[“a”,“b”]
输出:0
说明:D = {}
输入:[“zyx”,“wvu”,“tsr”]
输出:3
说明:D = {0,1,2}
注意:
1 <= A.length <= 100
1 <= A[i].length <= 1000
02 第一种解法
题目的意思是A中包含了许多长度一样的字符串元素,从纵向来看,单个字符串中的每一列字符大小关系需要是递增的,如果不是,则需要删除,问需要删除多少列字符,才能保证所有列的字符大小关系都是递增的。结合给的示例来看,[“cba”,“daf”,“ghi”],纵向来看就变成了下面这样:
cba --> c b a
daf --> d a f
ghi --> g h i
第一列为cdg,是递增的,不用删除,第二列为bah,不是递增,需要删除,第三列是afi,是递增的,不用删除,所以最后需要删除中间那列的字符,就能保证所有列的字符大小关系都是递增的,所以返回1。
思路:根据上面我们的分析,直接上两层循环就行,外层控制列数,内层控制行数,注意下标不能越界。
此解法的时间复杂度为O(A),A为数组A中所有字符的个数,空间复杂度为O(1)。
public int minDeletionSize(String[] A) {
int n = A[0].length(), len = A.length;
int count = 0;
for (int i=0; i<n; i++) {
for (int j=0; j<len-1; j++) {
if (A[j].charAt(i) > A[j+1].charAt(i)) {
count++;
break;
}
}
}
return count;
}
03 第二种解法
我们还可以使用二维数组来解题。
在第一种解法中,通过纵向观察,可以将A中的所有字符看成是一个二维数组,行是A中元素个数,列是A中单个字符串的长度,先将字符初始化进二维数组中,然后遍历二维数组,比较列上前后字符的大小关系,需要删除(前后不是递增顺序)就计数加1,最后返回累加的count。
此解法的时间复杂度时O(A),A为数组A中所有字符的个数,空间复杂度为O(N*M),N为数组A的长度,M为A中单个元素的长度。
public int minDeletionSize2(String[] A) {
int row = A.length, col = A[0].length();
char[][] arr = new char[row][col];
for (int i=0; i<A.length; i++) {
arr[i] = A[i].toCharArray();
}
int count = 0;
for (int i=0; i<col; i++) {
for (int j=0; j<row-1; j++) {
if (arr[j][i] > arr[j+1][i]) {
count++;
break;
}
}
}
return count;
}
04 小结
算法专题目前已连续日更超过七个月,算法题文章230+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode.944-删除列保证排序(Delete Columns to Make Sorted)的更多相关文章
- 【leetcode】955. Delete Columns to Make Sorted II
题目如下: We are given an array A of N lowercase letter strings, all of the same length. Now, we may cho ...
- 【Leetcode_easy】944. Delete Columns to Make Sorted
problem 944. Delete Columns to Make Sorted 题意:其实题意很简单,但是题目的description给整糊涂啦...直接看题目标题即可理解. solution: ...
- LC 955. Delete Columns to Make Sorted II
We are given an array A of N lowercase letter strings, all of the same length. Now, we may choose an ...
- 【LeetCode】944. Delete Columns to Make Sorted 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- LeetCode 944 Delete Columns to Make Sorted 解题报告
题目要求 We are given an array A of N lowercase letter strings, all of the same length. Now, we may choo ...
- 【leetcode】944. Delete Columns to Make Sorted
题目如下: We are given an array A of N lowercase letter strings, all of the same length. Now, we may cho ...
- Leetcode 944. Delete Columns to Make Sorted
class Solution: def minDeletionSize(self, A: List[str]) -> int: ans = 0 for j in range(len(A[0])) ...
- [Swift]LeetCode944. 删除列以使之有序 | Delete Columns to Make Sorted
We are given an array A of N lowercase letter strings, all of the same length. Now, we may choose an ...
- 【leetcode】960. Delete Columns to Make Sorted III
题目如下: We are given an array A of N lowercase letter strings, all of the same length. Now, we may cho ...
随机推荐
- Class.forName()方法抛出异常
在测试static块时间,想要调用Class.forName()来加载类,需要注意此方法要求必须要抛出异常,否则报错. 但在之后却一直抛出java.lang.ClassNotFoundExceptio ...
- Java多线程1:使用多线程的几种方式以及对比
前言 Java多线程的使用有三种方法:继承Thread类.实现Runnable接口和使用Callable和Future创建线程,本文将对这三种方法一一进行介绍. 1.继承Thread类 实现方式很简单 ...
- PHP中变量声明和定义的区别
先记录一下(不知道PHP是不是一样,但是C语言是这样的):把建立空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”.声明的最终目的是为了提前使用,即在定义之前使用,如果不需要提前使用 ...
- cogs1682. [HAOI2014]贴海报 x
1682. [HAOI2014]贴海报 ★★☆ 输入文件:ha14d.in 输出文件:ha14d.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] Bytetow ...
- 序列模式挖掘--SPADE算法
- hive 调优(三)tez优化
我们采用亚马逊emr构建的集群,用hive查询的时候报错,FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.e ...
- 第八周学习总结&实验报告六
实验总结 :类的继承 实验目的 理解异常的基本概念: 掌握异常处理方法及熟悉常见异常的捕获方法. 实验要求 : 练习捕获异常.声明异常.抛出异常的方法.熟悉try和catch子句的使用. 掌握自定义异 ...
- LeetCode 22. 括号生成(Generate Parentheses)
题目描述 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n =3,生成结果为: [ "((()))", "(() ...
- 解决:linux eclipse 对‘dlopen’未定义的引用, 对‘xxx’未定义的引用
如果是终端窗口执行的话直接: 在g++编译选项后面,加入dl的库,选项为-ldl,即可. 如果是在eclipse里的话: 在工程属性中->c/c++ build->gcc complier ...
- IJCAI 2019 Analysis
IJCAI 2019 Analysis 检索不到论文的关键词:retrofitting word embedding Getting in Shape: Word Embedding SubSpace ...