分而治之-快排

分而治之:把复杂的算法问题按一定的”分解”方法分为等价的规模较小的若干部分,然后逐个解决,分别找出个部分的解,把各部分的解组成整个问题的解。
根据算法图解
D&C策略:
(1)找出基线条件,这种条件必须尽可能简单。
(2)不断将问题分解(或者说缩小规模),直到符合基线条件。

从数组中选择一个元素,这个元素被称为 基准值(pivot)
快排的独特之处在于,其速度取决于选择的基准值。

LeetCode题目:
至少有 K 个重复字符的最长子串

给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于 k 。返回这一子串的长度。

示例 1:
输入:s = “aaabb”, k = 3
输出:3
解释:最长子串为 “aaa” ,其中 ‘a’ 重复了 3 次。

示例 2:
输入:s = “ababbc”, k = 2
输出:5
解释:最长子串为 “ababb” ,其中 ‘a’ 重复了 2 次, ‘b’ 重复了 3 次。

运用分治法:

class Solution {
    public int longestSubstring(String s, int k) {
        int n = s.length();
        return dfs(s, 0, n - 1, k);
    }

    public int dfs(String s, int l, int r, int k) {
        int[] cnt = new int[26];
        for (int i = l; i  r; i++) {
            cnt[s.charAt(i) - 'a']++;
        }

        char split = 0;
        for (int i = 0; i < 26; i++) {
            if (cnt[i] > 0 && cnt[i] < k) {
                split = (char) (i + 'a');
                break;
            }
        }
        if (split == 0) {
            return r - l + 1;
        }

        int i = l;
        int ret = 0;
        while (i  r) {
            while (i  r && s.charAt(i) == split) {
                i++;
            }
            if (i > r) {
                break;
            }
            int start = i;
            while (i  r && s.charAt(i) != split) {
                i++;
            }

            int length = dfs(s, start, i - 1, k);
            ret = Math.max(ret, length);
        }
        return ret;
    }
}

&#x4F18;&#x7F8E;&#x7684;&#x6392;&#x5217; II

给你两个整数 n 和 k ,请你构造一个答案列表 answer ,该列表应当包含从 1 到 n 的 n 个不同正整数,并同时满足下述条件:
假设该列表是 answer = [a1, a2, a3, … , an] ,那么列表 [|a1 – a2|, |a2 – a3|, |a3 – a4|, … , |an-1 – an|] 中应该有且仅有 k 个不同整数。
返回列表 answer 。如果存在多种答案,只需返回其中 任意一种 。

示例 1:

输入:n = 3, k = 1
输出:[1, 2, 3]
解释:[1, 2, 3] 包含 3 个范围在 1-3 的不同整数,并且 [1, 1] 中有且仅有 1 个不同整数:1
示例 2:

输入:n = 3, k = 2
输出:[1, 3, 2]
解释:[1, 3, 2] 包含 3 个范围在 1-3 的不同整数,并且 [2, 1] 中有且仅有 2 个不同整数:1 和 2

构造法:

class Solution {

    public int[] constructArray(int n, int k) {
        int[] res = new int[n];

        for (int i = 0; i < n - k - 1; i++) {
            res[i] = i + 1;
        }

        int j = 0;

        int left = n - k;
        int right = n;
        for (int i = n - k - 1; i < n; i++) {
            if (j % 2 == 0) {
                res[i] = left;
                left++;
            } else {
                res[i] = right;
                right--;
            }
            j++;
        }
        return res;
    }
}

Original: https://www.cnblogs.com/GeniusWang/p/15644213.html
Author: Genius_Wang
Title: 分而治之-快排

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/583140/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • ArchLinux安装-2022-01-12

    这篇教程,是我基于B站up住theCW的视频教程整理的,其中添加了一些我在安装n次之后的经验(虽然失败过几次,但我现在安装不会再出差错,所以请放心的看此教程) 当然,我认为theC…

    Linux 2023年5月27日
    093
  • windows系统命令行cmd查看显卡驱动版本号CUDA

    好看请赞,养成习惯:) 本文来自博客园,作者:靠谱杨, 转载请注明原文链接:https://www.cnblogs.com/rainbow-1/p/16656547.html 关于…

    Linux 2023年6月14日
    0120
  • Linux使用SNAT实现局域网上网

    1、一台能上网的Linux机器 2、操作步骤 host-10-11 配置snat,开启路由转发 iptables -t nat -A POSTROUTING -s 10.10.10…

    Linux 2023年6月6日
    097
  • 总结:弹性伸缩的五个条件与六个教训

    前言弹性伸缩是云计算时代给我们带来的一项核心技术红利,但是 IT 的世界中,没有一个系统功能可以不假思索的应用到所有的场景中。这篇文章,我们将应用企业级分布式应用服务-EDAS 的…

    Linux 2023年6月8日
    0102
  • Linux 下重启 PHP 服务、nginx 服务

    一、重启 PHP 服务 service php-fpm start 开启 service php-fpm stop 停止 service php-fpm restart 重启 二、…

    Linux 2023年6月13日
    084
  • SQLI-LABS(Less-3)

    Less-3(GET-Error based-Single quotes with twist-string) 打开 Less-3页面,可以看到页面中间有一句 Please inp…

    Linux 2023年6月6日
    090
  • 统计算法_概率基础

    本次有以下函数 1、简单边际概率 2、联合概率 3、条件概率 4、随机变量期望值 5、随机变量方差 6、随机变量协方差 7、联合协方差 8、组合期望回报 9、投资组合风险 说概率前…

    Linux 2023年6月6日
    091
  • 理论知识

    多线程的实现方式:1.继承Thread类;2.实现runnable接口;3.实现callable接口通过futrueTask包装器来创建Thread线程; 是继承Thread类号还…

    Linux 2023年6月7日
    0114
  • MIT6.828——Lab3 PartA(麻省理工操作系统实验)

    Lab3 Part A MIT6.828——Lab1 PartA MIT6.828——Lab1 PartB Lab2内存管理准备知识 MIT6.828——Lab2 内核维护有关用户…

    Linux 2023年5月27日
    0109
  • 嵌入式软件架构设计-程序分层

    1 前言 在嵌入式MCU软件开发过程中,程序分层设计也是重中之重,关系到整个软件开发过程中的协同开发,降低系统软件的复杂度(复杂问题分解)和依赖关系、同时有利于标准化,便于管理各层…

    Linux 2023年6月7日
    0147
  • Linux Ubuntu 下载&安装 MySQL

    1. 下载安装 下载&安装:一句搞定 sudo apt update sudo apt install mysql-server 查看版本信息 mysql –versio…

    Linux 2023年6月14日
    0106
  • 内部类

    内部类:将一个类的定义放在另一个类的定义内部。内部类机制可以把逻辑相关的类组织在一起,并控制位于内部的类的可视性。 内部类与组合是完全不同的概念。 内部类不仅是一种代码隐藏机制(将…

    Linux 2023年6月8日
    0104
  • shell 同时执行多任务下载视频

    本文为博主原创,转载请注明出处: shell 脚本不支持多线程,但我们需要用shell 脚本同时跑多个任务时怎么让这些任务并发同时进行,可以采用在每个任务 后面 添加一个 &amp…

    Linux 2023年6月14日
    0111
  • 【原创】Linux虚拟化KVM-Qemu分析(六)之中断虚拟化

    背景 Read the fucking source code! –By 鲁迅 A picture is worth a thousand words. –…

    Linux 2023年6月8日
    0111
  • CentOS7安装MySQL5.7并配置账户等

    注意: 有的Centos版本默认安装了mariadb, 可以先将其卸载 检查mariadb是否安装 yum list installed | grep mariadb 卸载mari…

    Linux 2023年6月6日
    078
  • Popovers

    弹出式窗口弹出式窗口是一个短暂的视图,当你点击一个控件或一个区域时,它就会出现在屏幕上的其他内容之上。通常情况下,弹出窗口包括一个箭头,指向它出现的位置。弹出式窗口可以是非模态或模…

    Linux 2023年6月7日
    099
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球