这是悦乐书的第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的长度,MA中单个元素的长度。

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)的更多相关文章

  1. 【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 ...

  2. 【Leetcode_easy】944. Delete Columns to Make Sorted

    problem 944. Delete Columns to Make Sorted 题意:其实题意很简单,但是题目的description给整糊涂啦...直接看题目标题即可理解. solution: ...

  3. 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 ...

  4. 【LeetCode】944. Delete Columns to Make Sorted 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  5. 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 ...

  6. 【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 ...

  7. 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])) ...

  8. [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 ...

  9. 【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 ...

随机推荐

  1. Windows 和 Linux 下生成以当前时间命名的文件

    在 Windows.Linux 操作系统,分别利用BAT批处理文件和Shell脚本,生成类似“20110228_082905.txt”以“年月日_时分秒”命名的文件. Windows BAT批处理文件 ...

  2. 微信小程序let和var以及const有什么区别

    在JavaScript中有三种声明变量的方式:var.let.const. var:声明全局变量,换句话理解就是,声明在for循环中的变量,跳出for循环同样可以使用. for(var i=0;i&l ...

  3. Mybaits 查询 choose when 的使用

    @Select("<script>"+ "SELECT * " + "FROM bgs_housing A" + " ...

  4. shell学习——关于shell函数库的使用

    shell函数库的理解: 个人理解,shell函数库实质为一个脚本,脚本内包含了多个函数(函数具有普遍适用性). shell函数库的调用: 通过  . /path/lib/file.lib 或者 so ...

  5. 2019春Python程序设计练习4(4.9-4.15)

    1-1 如下代码可以实现当输入6的时候输出x>5,输入4的时候输出 3<x<=5,输入1的时候输出x<=3 x = int(input()) if x>5: print( ...

  6. 一次linux站点安装经验

    之前了解了一点,刚过完年回来,顺便研究了一下小程序. http://s.w7.cc/index.php?c=wiki&do=view&id=1&list=84 先申请了一个li ...

  7. [大数据] hadoop伪分布式安装

    注意:节点主机的hostname不要带"_"等字符,否则会报错. 一.安装jdk rpm -i jdk-7u80-linux-x64.rpm 配置java环境变量: vi + /e ...

  8. laravel发送邮件模板中点击的链接url动态生成

    邮件模板里有url链接,生成链接有三种方式(目前总结出这三种方式)这个链接可以是: http://www.xxx.com/active?id=xxx&token=xxx   这种形式是把url ...

  9. 暑假集训 #3div2 C Sequence 数字找规律

    C. Sequence (64 Mb, 1 sec / test)Integer sequences are very interesting mathematical objects. Let us ...

  10. (Java多线程系列三)线程间通讯

    Java多线程间通讯 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同. 1.使用wait()和notify()方法在线程中通讯 需求:第一个线程写入(input)用户,另一个线程 ...