删列造序 II
给定由 n 个字符串组成的数组 strs,其中每个字符串长度相等。
选取一个删除索引序列,对于 strs 中的每个字符串,删除对应每个索引处的字符。
比如,有 strs = ["abcdef", "uvwxyz"],删除索引序列 {0, 2, 3},删除后 strs 为["bef", "vyz"]。
假设,我们选择了一组删除索引 answer,那么在执行删除操作之后,最终得到的数组的元素是按 字典序(strs[0] <= strs[1] <= strs[2] ... <= strs[n - 1])排列的,然后请你返回 answer.length 的最小可能值。
示例 1:
输入:strs = ["ca","bb","ac"]输出:1解释:
删除第一列后,strs = ["a", "b", "c"]。
现在 strs 中元素是按字典排列的 (即,strs[0] <= strs[1] <= strs[2])。
我们至少需要进行 1 次删除,因为最初 strs 不是按字典序排列的,所以答案是 1。
示例 2:
输入:strs = ["xc","yb","za"]输出:0解释:
strs 的列已经是按字典序排列了,所以我们不需要删除任何东西。
注意 strs 的行不需要按字典序排列。
也就是说,strs[0][0] <= strs[0][1] <= ... 不一定成立。
示例 3:
输入:strs = ["zyx","wvu","tsr"]输出:3解释:
我们必须删掉每一列。
提示:
- n == strs.length
- 1 <= n <= 100
- 1 <= strs[i].length <= 100
- strs[i] 由小写英文字母组成
思路
1、逐个遍历元素,判断元素与下一元素的顺序是否升序
2、按照字符列逐个比较,如果不是升序,表示该列需要删除,则删除该列,并重新执行1
3、直到所有都是按照顺序
代码
import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream; /** *https://leetcode.cn/problems/delete-columns-to-make-sorted-ii/description/ * 贪心 */ public class Main { public static void main(String[] args) { Solution solution = new Solution(); int i = solution.minDeletionSize(new String[] {"ousnatait", "xzswvwztr", "luknznxob"}); System.out.println(i); // solution.maxSlidingWindow(new int[]{1,3,-1,-3,5,3,6,7}, 3); } } class Solution { public int minDeletionSize(String[] strs) { HashSet<Integer> delContainer = new HashSet<>(); //1、冒泡遍历,两两比较顺序 for (int i = 0; i < strs.length - 1; i++) { while (!isOrder(strs[i], strs[i + 1], delContainer)){ i = 0; } if (delContainer.size() == strs[0].length()){ break; } } return delContainer.size(); } private boolean isOrder(String s1, String s2, HashSet<Integer> delContainer) { for (int i = 0; i < s1.length(); i++) { if (delContainer.contains(i)){ continue; } if (s1.charAt(i) < s2.charAt(i)){ return true; } if (s1.charAt(i) > s2.charAt(i)){ delContainer.add(i); return false; } } return true; } }
Linux等环境软件安装