LeetCode——944. 删列造序

简介: LeetCode——944. 删列造序

944. 删列造序


题目描述

答案

我的答案

官网答案

直接遍历


题目描述


给你由 n 个小写字母字符串组成的数组 strs,其中每个字符串长度相等。


这些字符串可以每个一行,排成一个网格。例如,strs = ["abc", "bce", "cae"] 可以排列为:

abc

bce

cae

你需要找出并删除 不是按字典序升序排列的 列。在上面的例子(下标从 0 开始)中,列 0('a', 'b', 'c')和列 2('c', 'e', 'e')都是按升序排列的,而列 1('b', 'c', 'a')不是,所以要删除列 1 。

返回你需要删除的列数。


示例 1:

输入:strs = [“cba”,“daf”,“ghi”]

输出:1

解释:网格示意如下:

cba

daf

ghi

列 0 和列 2 按升序排列,但列 1 不是,所以只需要删除列 1 。


示例 2:

输入:strs = [“a”,“b”]

输出:0

解释:网格示意如下:

a

b

只有列 0 这一列,且已经按升序排列,所以不用删除任何列。


示例 3:

输入:strs = [“zyx”,“wvu”,“tsr”]

输出:3

解释:网格示意如下:

zyx

wvu

tsr

所有 3列都是非升序排列的,所以都要删除。


提示:

n == strs.length

1 <= n <= 100

1 <= strs[i].length <= 1000

strs[i] 由小写英文字母组成


答案


我的答案


class Solution {
    public int minDeletionSize(String[] strs) {
        int y = 0;
        for (int i = 0; i < strs[0].length(); i++) {
            int x = 0;
            for (String str : strs) {
                if (x <= str.charAt(i)) {
                    x = str.charAt(i);
                } else {
                    y++;
                    break;
                }
            }
        }
        return y;
    }
}


官网答案


直接遍历


思路与算法


题目要求删除不是按字典序升序排列的列,由于每个字符串的长度都相等,我们可以逐列访问字符串数组,统计不是按字典序升序排列的列。


对于第 jj 列的字符串,我们需要检测所有相邻字符是否均满足 strs[i−1][j]≤strs[i][j]。


代码

class Solution {
    public int minDeletionSize(String[] strs) {
        int row = strs.length;
        int col = strs[0].length();
        int ans = 0;
        for (int j = 0; j < col; ++j) {
            for (int i = 1; i < row; ++i) {
                if (strs[i - 1].charAt(j) > strs[i].charAt(j)) {
                    ans++;
                    break;
                }
            }
        }
        return ans;
    }
}


复杂度分析


时间复杂度:O(m×n),其中 m 为字符串数组的长度,n 为数组中每个字符串的长度,判定每一列的的字典序需要遍历字符串数组每一列,因此时间复杂度为 O(m×n)。

空间复杂度:O(1)。

相关文章
|
2月前
【LeetCode 02】暴力法总结
【LeetCode 02】暴力法总结
21 1
|
7月前
leetcode-475:供暖器
leetcode-475:供暖器
53 0
顺手牵羊(LeetCode844.)
好多同学说这是双指针法,但是我认为叫它顺手牵羊法更合适
85 0
leetcode第37题
从上到下,从左到右遍历每个空位置。在第一个位置,随便填一个可以填的数字,再在第二个位置填一个可以填的数字,一直执行下去直到最后一个位置。期间如果出现没有数字可以填的话,就回退到上一个位置,换一下数字,再向后进行下去。
leetcode第37题
leetcode第39题
对回溯法又有了更深的了解,一般的架构就是一个大的 for 循环,然后先 add,接着利用递归进行向前遍历,然后再 remove ,继续循环。而解法二的动态规划就是一定要找到递进的规则,开始的时候就想偏了,导致迟迟想不出来。
leetcode第39题
|
存储 算法
leetcode第49题
时间复杂度:两层 for 循环,再加上比较字符串,如果字符串最长为 K,总的时间复杂度就是 O(n²K)。 空间复杂度:O(NK),用来存储结果。 解法一算是比较通用的解法,不管字符串里边是大写字母,小写字母,数字,都可以用这个算法解决。这道题的话,题目告诉我们字符串中只有小写字母,针对这个限制,我们可以再用一些针对性强的算法。 下边的算法本质是,我们只要把一类的字符串用某一种方法唯一的映射到同一个位置就可以。
187 0
leetcode第49题
leetcode第36题
一个 9 * 9 的数独的棋盘。判断已经写入数字的棋盘是不是合法。需要满足下边三点, • 每一行的数字不能重复 • 每一列的数字不能重复 • 9 个 3 * 3 的小棋盘中的数字也不能重复。 只能是 1 - 9 中的数字,不需要考虑数独最后能不能填满
leetcode第36题
|
C++ Python
LeetCode 771. Jewels and Stones
LeetCode 771. Jewels and Stones
82 0
|
算法
leetcode第30题
如上图,利用循环变量 i ,依次后移,判断每个子串是否符合即可。 怎么判断子串是否符合?这也是这个题的难点了,由于子串包含的单词顺序并不需要固定,如果是两个单词 A,B,我们只需要判断子串是否是 AB 或者 BA 即可。如果是三个单词 A,B,C 也还好,只需要判断子串是否是 ABC,或者 ACB,BAC,BCA,CAB,CBA 就可以了,但如果更多单词呢?那就崩溃了。 链接)的作者提出了,用两个 HashMap 来解决。首先,我们把所有的单词存到 HashMap 里,key 直接存单词,value 存单词出现的个数(因为给出的单词可能会有重复的,所以可能是 1 或 2 或者其他)。然后扫描子
125 0
leetcode第30题
leetcode第33题
问题出在,当数组剩偶数长度的时候,mid = (start + end)/ 2,mid 取的是左端点。上图的例子, mid > end, 更新 start = mid,start 位置并不会变化。那么下一次 mid 的值也不会变,就死循环了。所以,我们要更新 start = mid + 1。 综上,找最小值的下标的代码就出来了,同时,由于我们找的是位置 0 对应的下标,所以偏移就是最小值的下标.
leetcode第33题