944. 删列造序

944. 删列造序

描述:

给定由 N 个小写字母字符串组成的数组 A,其中每个字符串长度相等。

删除 操作的定义是:选出一组要删掉的列,删去 A 中对应列中的所有字符,形式上,第 n 列为 [A[0][n], A[1][n], ..., A[A.length-1][n]])。

比如,有 A = ["abcdef", "uvwxyz"],

要删掉的列为 {0, 2, 3},删除后 A 为["bef", "vyz"], A 的列分别为["b","v"], ["e","y"], ["f","z"]。

你需要选出一组要删掉的列 D,对 A 执行删除操作,使 A 中剩余的每一列都是 非降序 排列的,然后请你返回 D.length 的最小可能值。

示例 1:

输入:["cba", "daf", "ghi"]
输出:1
解释:
当选择 D = {1},删除后 A 的列为:["c","d","g"] 和 ["a","f","i"],均为非降序排列。
若选择 D = {},那么 A 的列 ["b","a","h"] 就不是非降序排列了。
示例 2:

输入:["a", "b"]
输出:0
解释:D = {}
示例 3:

输入:["zyx", "wvu", "tsr"]
输出:3
解释:D = {0, 1, 2}

提示:

1 <= A.length <= 100
1 <= A[i].length <= 1000

 1 解法1:64 ms    13.1 MB
 2 class Solution {
 3 public:
 4     int minDeletionSize(vector<string>& A) {
 5         /*
 6         思路:字符串每个长度都相等,相等于二维数组一样
 7                A中的列是非降序排序 即:升序排列
 8               遍历每一列字符串中的每一个字符;
 9               遍历A.size()行,若前一行>后一行  那么删除这一列,贪心
10               否则继续,进行下一个比较
11               最后统计字符串的长度;原先字符串的长度-现在剩余的长度,就是删除的列D
12         */
13         int sum=A[0].size();//记录原先多少列
14         //如果只有一个数据["a.."]; 返回0;
15         if(A.size()==1) return 0;
16         vector<int> v;
17         for(int i=0;i<A[0].size();i++){//遍历所有列,看列是否是递增的
18             for(int j=1;j<A.size();j++){
19                 if(A[j-1][i]-‘a‘>A[j][i]-‘a‘){//贪心 不满足就删除
20                     for(int k=0;k<A.size();k++){//删除列
21                         A[k].erase(i,1);
22                     }
23                     i--;//恢复 回到当前列,跳出,继续从现在这一列开始
24                     break;
25                 }
26             }
27         }
28         return sum-A[0].size();//删除了多少列
29     }
30 };
 1 优化;不需要删除,定义一个 变量++就可以了
 2 解法2:    52 ms    13 MB
 3 class Solution {
 4 public:
 5     int minDeletionSize(vector<string>& A) {
 6         /*
 7         思路:字符串每个长度都相等,相等于二维数组一样
 8                A中的每一列是非降序排序 即:升序排列,最后求删除多少不和的列cnt
 9               遍历每一列字符串中的每一个字符;
10               遍历A.size()行,若前一行>后一行 那么删除这一列,贪心
11               否则继续,进行下一个比较
12               输出cnt删除的列数即可
13         */
14         //如果只有一个数据["a.."]; 返回0;
15         if(A.size()==1) return 0;
16         int cnt=0;
17         for(int i=0;i<A[0].size();i++){//遍历所有列,看列是否是递增的
18             for(int j=1;j<A.size();j++){
19                 if(A[j-1][i]>A[j][i]){//贪心 不满足就删除
20                     cnt++;//跳出 执行下一列 ,继续从现在这一列开始
21                     break;
22                 }
23             }
24         }
25         return cnt;//删除了多少列
26     }
27 };
 1 也可以正向做:
 2 解法3:    52 ms    13 MB
 3
 4 class Solution {
 5 public:
 6     int minDeletionSize(vector<string>& A) {
 7         int count = 0;
 8         for(int i=0;i<A[0].length();i++){
 9             for(int j=0;j<A.size()-1;j++){
10                 if(A[j][i]>A[j+1][i]){
11                     count++;
12                     break;
13                 }
14             }
15         }
16         return count;
17     }
18 };

原文地址:https://www.cnblogs.com/NirobertEinteson/p/11986527.html

时间: 2024-08-30 16:31:15

944. 删列造序的相关文章

leetcode 944. 删列造序(Delete Columns to Make Sorted)

目录 题目描述: 示例 1: 示例 2: 示例 3: 解法: 题目描述: 给定由 N 个小写字母字符串组成的数组 A,其中每个字符串长度相等. 选取一个删除索引序列,对于 A 中的每个字符串,删除对应每个索引处的字符. 所余下的字符串行从上往下读形成列. 比如,有 A = ["abcdef", "uvwxyz"],删除索引序列 {0, 2, 3},删除后 A 为["bef", "vyz"], A 的列分别为["b&q

[Swift Weekly Contest 115]LeetCode960. 删列造序 ||| | 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 choose any set of deletion indices, and for each string, we delete all the characters in those indices. For example, if we have an array A = ["babca",&quo

查压型性委如也级指办机习列造任wNObbwld8lco

为了从不同环节,尤其与广大使用人群直接关系的环节反映质量状况,对共享自行车投放点.运营仓库.生产企业等不同环节的产品抽查,覆盖了共享自行车从成品出厂到待投放的关键环节. 该负责人称,根据新车投放情况,结合共享自行车行业市场占有分布特点,本次重点抽查了摩拜.ofo.Hellobike三个品牌的产品,占本次抽查批次总数的83.3%.其中,在天津.无锡.武汉.广州.深圳.东莞6个城市抽查了9批次摩拜产品,占产品抽查批次总数的37.5%,抽查批次合格率88.9%,抽查不合格的1批次产品为待投放于广州市的

Leetcode题解 - 贪心算法部分简单题目代码+思路(860、944、1005、1029、1046、1217、1221)

leetcode真的是一个学习阅读理解的好地方 860. 柠檬水找零 """ 因为用户支付的只会有5.10.20 对于10元的用户必须找一个5 对于20元的用户可以找(三个5)或者(一个10一个5),每次都从大的开始找起来 """ class Solution: def lemonadeChange(self, bills) -> bool: five = 0 ten = 0 for i in bills: if i == 5: five

leet

# 题名1 两数之和    2 两数相加    3 无重复字符的最长子串    4 寻找两个有序数组的中位数    5 最长回文子串    6 Z 字形变换    7 整数反转    8 字符串转换整数 (atoi)    9 回文数    10 正则表达式匹配    11 盛最多水的容器    12 整数转罗马数字    13 罗马数字转整数    14 最长公共前缀    15 三数之和    16 最接近的三数之和    17 电话号码的字母组合    18 四数之和    19 删除链表

leetcode 0208

目录 ? 108. 将有序数组转换为二叉搜索树 描述 解答 py [todo rev 0208]py知识:if not x: 和if x is not None:和if not x is None:使用 ? 344. 反转字符串 描述 解答 ? 944. 删列造序 描述 解答 when you use py: using zip when u use c: dive deep into 2d array ? 181. 超过经理收入的员工 描述 解答 sql 的 as ? 108. 将有序数组转换

python 按二维数组的某行或列排序 (numpy lexsort)

lexsort支持对数组按指定行或列的顺序排序:是间接排序,lexsort不修改原数组,返回索引. 默认按最后一行元素有小到大排序, 返回最后一行元素排序后索引所在位置. 设数组a, 返回的索引ind, a可以是1维或2维数组,ind返回的是一维数组 对于一维数组, a[ind]就是排序后的数组. 对于二维数组下面会详细举例. import numpy as np >>> a array([[ 2,  7,  4,  2], [35,  9,  1,  5], [22, 12,  3, 

JS组件系列——表格组件神器:bootstrap table(二:父子表和行列调序)

原文:JS组件系列--表格组件神器:bootstrap table(二:父子表和行列调序) 前言:上篇 JS组件系列——表格组件神器:bootstrap table 简单介绍了下Bootstrap Table的基础用法,没想到讨论还挺热烈的.有园友在评论中提到了父子表的用法,今天就结合Bootstrap table的父子表和行列调序的用法再来介绍下它稍微高级点的用法. bootstrap table系列: JS组件系列——表格组件神器:bootstrap table JS组件系列——表格组件神器

js删除table一列

删除指定列的思想很简单:删除每一行的对应列的单元格,即一个单元格一个单元格删除.如:一个table有2行3列,若要删除第删列,只需要第一行第三列单元格和第二行第三列单元格. 以下我示例代码: <table id="table"><tr><td>第1行第1列</td><td id="delID">第1行第2列</td></tr><tr><td>第2行第1列<