【每日算法】算法复习一

存在重复元素 II

给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums[i]=nums[j],并且 i 和 j 的差的 绝对值 至多为 k。

示例 1:
输入: nums = [1,2,3,1], k = 3
输出: true
示例 2:
输入: nums = [1,0,1,1], k = 1
输出: true
示例 3:
输入: nums = [1,2,3,1,2,3], k = 2
输出: false
def containsNearbyDuplicate(nums, k):
    #定义 一个map,去记录每个元素在数组中的索引
    dic={}
    for i,v in enumerate(nums):
        if v in dic:
            #判断 是否满足索引差的绝对值至多为 k
            # print(dic[v],i,dic[v]-i)
            if i-dic[v]<=k: return true dic[v]="i" false < code></=k:>

存在重复元素 III

&#x7ED9;&#x4F60;&#x4E00;&#x4E2A;&#x6574;&#x6570;&#x6570;&#x7EC4; nums &#x548C;&#x4E24;&#x4E2A;&#x6574;&#x6570;&#xA0;k &#x548C; t &#x3002;&#x8BF7;&#x4F60;&#x5224;&#x65AD;&#x662F;&#x5426;&#x5B58;&#x5728; &#x4E24;&#x4E2A;&#x4E0D;&#x540C;&#x4E0B;&#x6807; i &#x548C; j&#xFF0C;&#x4F7F;&#x5F97;&#xA0;abs(nums[i]-nums[j])<=t ,同时又满足abs(i-j) <="k" 。 如果存在则返回 true,不存在返回 false。 示例 1: 输入:nums="[1,2,3,1]," k="3," t="0" 输出:true 示例 2: 3: 输出:false code></=t>

abs(i-j)=k可知,窗口大小为 k+1时,窗口内的元素索引差都会小于 k,然后在用新增的元素与窗口内的其他元素进行比较差值是否满足 abs(nums[i]-nums[j])<=t< code>&#x5373;&#x53EF;<!--=t<-->

def containsNearbyAlmostDuplicate(nums, k, t):
    #abs(i-j)<=t,可知窗口的大小为k+1 q="collections.deque()" # print(q) for i,v in enumerate(nums): q.append(i) #如果超过窗口的最大值,则移除左左侧的元素 if len(q)>k+1:
            q.popleft()
        for j in q:
            if j</=t,可知窗口的大小为k+1>

可是在提交测试时,显示超时,时间复杂度len(nums)*k,显然滑动窗口的解法不合适,那使用桶排序吧

桶排序的思路:因为差值为 t,所以需要 t+1个桶,则桶内每个元素的差值都 <=t< code>,&#x5982;&#x679C;&#x5F53;&#x524D;&#x6876;&#x5185;&#x6CA1;&#x6709;&#x5143;&#x7D20;&#xFF0C;&#x5219;&#x5F80;&#x524D;&#x4E00;&#x4E2A;&#x6876;&#x67E5;&#x627E;&#xFF0C;&#x5982;&#x679C;&#x6709;&#x503C;&#xFF0C;&#x5E76;&#x4E14;<code><=u-t< code>&#xFF0C;&#x6216;&#x8005;&#x5F80;&#x4E0B;&#x4E00;&#x4E2A;&#x6876;&#x627E;&#xFF0C;&#x5E76;&#x4E14;<code>>=u+t</code>&#x4E3A;&#x6EE1;&#x8DB3;&#x6761;&#x4EF6;&#xFF0C;&#x5E76;&#x4E14;k&#x53BB;&#x7EF4;&#x62A4;&#x6876;&#x7684;&#x603B;&#x4E2A;&#x6570;<!--=u-t<--></code><!--=t<-->

def containsNearbyAlmostDuplicate(nums, k, t):
    def getIdx(u):
        return u//(t+1)
    buckets={}#&#x5B9A;&#x4E49;&#x4E00;&#x4E2A;&#x96C6;&#x5408;
    for i,v in enumerate(nums):
        # print(buckets)
        idx=getIdx(v)#&#x627E;&#x5230;&#x8BE5;&#x5143;&#x7D20;&#x6570;&#x636E;&#x54EA;&#x4E2A;&#x6876;
        #&#x5982;&#x679C;&#x96C6;&#x5408;&#x4E2D;&#x4FDD;&#x5B58;&#x8FD9;&#x4E2A;&#x5143;&#x7D20;,&#x5219;&#x6EE1;&#x8DB3;&#x6761;&#x4EF6;&#x76F4;&#x63A5;&#x8FD4;&#x56DE;
        if idx in buckets:
            return True
        #&#x627E;&#x4E0A;&#x4E00;&#x4E2A;&#xFF0C;&#x4E0B;&#x4E00;&#x4E2A;&#x6876;
        if idx-1 in buckets and buckets[idx-1]>=v-t:
            return True
        if idx+1 in buckets and buckets[idx+1]<=v+t: return true #保存当前元素 buckets[idx]="v" if len(buckets)>k:
            buckets.pop(getIdx(nums[i-k]))
    return False
</=v+t:>

长度最小的子数组

&#x7ED9;&#x5B9A;&#x4E00;&#x4E2A;&#x542B;&#x6709;&#xA0;n&#xA0;&#x4E2A;&#x6B63;&#x6574;&#x6570;&#x7684;&#x6570;&#x7EC4;&#x548C;&#x4E00;&#x4E2A;&#x6B63;&#x6574;&#x6570; target &#x3002;
&#x627E;&#x51FA;&#x8BE5;&#x6570;&#x7EC4;&#x4E2D;&#x6EE1;&#x8DB3;&#x5176;&#x548C; &#x2265; target &#x7684;&#x957F;&#x5EA6;&#x6700;&#x5C0F;&#x7684; &#x8FDE;&#x7EED;&#x5B50;&#x6570;&#x7EC4;&#xA0;[numsl, numsl+1, ..., numsr-1, numsr] &#xFF0C;&#x5E76;&#x8FD4;&#x56DE;&#x5176;&#x957F;&#x5EA6;&#x3002;&#x5982;&#x679C;&#x4E0D;&#x5B58;&#x5728;&#x7B26;&#x5408;&#x6761;&#x4EF6;&#x7684;&#x5B50;&#x6570;&#x7EC4;&#xFF0C;&#x8FD4;&#x56DE; 0 &#x3002;
&#x8F93;&#x5165;&#xFF1A;target = 7, nums = [2,3,1,2,4,3]
&#x8F93;&#x51FA;&#xFF1A;2
&#x89E3;&#x91CA;&#xFF1A;&#x5B50;&#x6570;&#x7EC4; [4,3] &#x662F;&#x8BE5;&#x6761;&#x4EF6;&#x4E0B;&#x7684;&#x957F;&#x5EA6;&#x6700;&#x5C0F;&#x7684;&#x5B50;&#x6570;&#x7EC4;&#x3002;
&#x8F93;&#x5165;&#xFF1A;target = 4, nums = [1,4,4]
&#x8F93;&#x51FA;&#xFF1A;1

使用可变的窗口,首先扩大窗口,使窗口内的总和扩大,当出现和>=target时,记录窗口左右边界的值,然后再缩小窗口,直到小于target时,在记录左右边界,并与之前比较,记录最小的那个;然后在重复上面的步骤,直到数组结尾。

def minSubArrayLen(target, nums):
    #&#x5206;&#x522B;&#x8BB0;&#x5F55;&#x5DE6;&#x53F3;&#x8FB9;&#x754C;&#xFF0C;&#x548C;&#x7A97;&#x53E3;&#x5185;&#x548C;
    left,right,total=0,0,0
    res=(left,float('inf'))
    n=len(nums)
    while right<n: total+="nums[right]" if total>=target:#&#x603B;&#x548C;&#x5927;&#x4E8E;&#x7B49;&#x4E8E;target&#x65F6;
            #&#x5DE6;&#x79FB;&#x5DE6;&#x8FB9;&#x754C;
            while left<=right and total>=target:
                #&#x8BB0;&#x5F55;&#x5DE6;&#x53F3;&#x8FB9;&#x754C;
                if res[1]-res[0]>right-left:
                    res=(left,right)
                total-=nums[left]
                left+=1
        right+=1
    return 0 if res[1]>n else res[1]-res[0]+1
</=right></n:>

无重复字符的最长子串

&#x7ED9;&#x5B9A;&#x4E00;&#x4E2A;&#x5B57;&#x7B26;&#x4E32; s &#xFF0C;&#x8BF7;&#x4F60;&#x627E;&#x51FA;&#x5176;&#x4E2D;&#x4E0D;&#x542B;&#x6709;&#x91CD;&#x590D;&#x5B57;&#x7B26;&#x7684;&#xA0;&#x6700;&#x957F;&#x5B50;&#x4E32;&#xA0;&#x7684;&#x957F;&#x5EA6;&#x3002;
&#x793A;&#x4F8B;&#xA0;1:
&#x8F93;&#x5165;: s = "abcabcbb"
&#x8F93;&#x51FA;: 3
&#x89E3;&#x91CA;: &#x56E0;&#x4E3A;&#x65E0;&#x91CD;&#x590D;&#x5B57;&#x7B26;&#x7684;&#x6700;&#x957F;&#x5B50;&#x4E32;&#x662F; "abc"&#xFF0C;&#x6240;&#x4EE5;&#x5176;&#x957F;&#x5EA6;&#x4E3A; 3&#x3002;
&#x793A;&#x4F8B; 2:
&#x8F93;&#x5165;: s = "bbbbb"
&#x8F93;&#x51FA;: 1
&#x89E3;&#x91CA;: &#x56E0;&#x4E3A;&#x65E0;&#x91CD;&#x590D;&#x5B57;&#x7B26;&#x7684;&#x6700;&#x957F;&#x5B50;&#x4E32;&#x662F; "b"&#xFF0C;&#x6240;&#x4EE5;&#x5176;&#x957F;&#x5EA6;&#x4E3A; 1&#x3002;
&#x793A;&#x4F8B; 3:
&#x8F93;&#x5165;: s = "pwwkew"
&#x8F93;&#x51FA;: 3
&#x89E3;&#x91CA;: &#x56E0;&#x4E3A;&#x65E0;&#x91CD;&#x590D;&#x5B57;&#x7B26;&#x7684;&#x6700;&#x957F;&#x5B50;&#x4E32;&#x662F;&#xA0;"wke"&#xFF0C;&#x6240;&#x4EE5;&#x5176;&#x957F;&#x5EA6;&#x4E3A; 3&#x3002;
&#xA0;    &#x8BF7;&#x6CE8;&#x610F;&#xFF0C;&#x4F60;&#x7684;&#x7B54;&#x6848;&#x5FC5;&#x987B;&#x662F; &#x5B50;&#x4E32; &#x7684;&#x957F;&#x5EA6;&#xFF0C;"pwke"&#xA0;&#x662F;&#x4E00;&#x4E2A;&#x5B50;&#x5E8F;&#x5217;&#xFF0C;&#x4E0D;&#x662F;&#x5B50;&#x4E32;&#x3002;
&#x793A;&#x4F8B; 4:
&#x8F93;&#x5165;: s = ""
&#x8F93;&#x51FA;: 0

依然使用双指针的方式定义窗口的左右边界,使用hash来保存窗口内的元素,当新元素在hash里面的话,移动左边界并逐步删除hash里面的元素,直到不存在重复的元素位置,并计算dic的长度

import collections
def lengthOfLongestSubstring(s):
    dic={}#&#x4FDD;&#x5B58;&#x7A97;&#x53E3;&#x5185;&#x7684;&#x5143;&#x7D20;
    left=0#&#x5DE6;&#x53F3;&#x79FB;&#x52A8;&#x7684;&#x7A97;&#x53E3;
    n=len(s)
    res=0#&#x6700;&#x540E;&#x7684;&#x7ED3;&#x679C;
    q=collections.deque()
    for right in range(n):
        c=s[right]
        #&#x5982;&#x679C;&#x5728;&#x7A97;&#x53E3;&#x91CC;&#x9762;&#xFF0C;&#x4ECE;&#x5DE6;&#x5230;&#x53F3;&#x9010;&#x4E2A;&#x5224;&#x65AD;&#x662F;&#x5426;&#x76F8;&#x7B49;&#xFF0C;&#x76F8;&#x7B49;&#x5219;&#x5220;&#x9664;
        while c in dic and left<right: dic.pop(s[left]) left+="1" dic[c]="right" res="max(res,len(dic))" return < code></right:>

滑动窗口最大值

`
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回滑动窗口中的最大值。
示例 1:
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置 最大值

Original: https://www.cnblogs.com/hitechr/p/15120088.html
Author: Hitechr
Title: 【每日算法】算法复习一

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

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

(0)

大家都在看

  • 程序员你的maven多模块项目如何对外输出为一个构件?

    上图为常见的台式机,程序员,你看了有啥启发? 台式机生产线 我的maven代码工程 xxx 显示器 xxx-web 主机 xxx-app 键盘 xxx-domian 鼠标 xxx-…

    Java 2023年6月8日
    085
  • LeetCode 螺旋矩阵 II

    Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。 题目 螺旋矩阵 II: 给你一个正整数 n ,生成一个包含 1 到 n^2 所有元素,且元素按顺时针…

    Java 2023年6月7日
    0105
  • JVM_字符串常量池地址问题

    先看下代码 public class JVMDemo { public static void main(String[] args) { String s1 = "ab…

    Java 2023年6月5日
    072
  • 设计模式之责任链

    你是否还在一个方法里面列出几个甚至几十个其他方法的调用呢?遇到这种情况如何优雅的设计代码,你可能需要看看责任链设计模式。 概述 责任链模式(Chain of Responsibil…

    Java 2023年6月14日
    0102
  • 分布式基础- 拜占庭将军问题

    一 背景 拜占庭将军问题是如何通过通讯方式来达成共识得问题,Leslie Lamport 来借助这个问题说明如何在分布式环境下达成共识。 拜占庭将军问题是这样的:拜占庭帝国的军队在…

    Java 2023年5月30日
    091
  • Java使用Cipher类实现加密,包括DES,DES3,AES和RSA加密

    Original: https://www.cnblogs.com/libin6505/p/16446784.htmlAuthor: 戈博折刀Title: Java使用Cipher…

    Java 2023年5月29日
    079
  • vscode中编写node.js代码的提示功能

    1.安装typings包 安装命令 // &#x4F7F;&#x7528;cnpm,&#x524D;&#x63D0;&#x914D;&amp…

    Java 2023年6月15日
    076
  • MySQL 数据库性能优化之索引优化

    Original: https://www.cnblogs.com/wxweven/archive/2012/04/18/2454984.htmlAuthor: wxwevenTi…

    Java 2023年6月9日
    0145
  • Windows常用命令手册

    cmd 命令手册 端口命令 查看端口占用详情 netstat -ano 查找过滤命令 findstr (相似Linux中grep) 例如需要查找8080端口占用详情:netstat…

    Java 2023年6月7日
    079
  • SpringMVC请求流程源码分析

    一、SpringMVC使用 1.工程创建 创建maven工程。 添加java、resources目录。 引入Spring-webmvc 依赖。 org.springframewor…

    Java 2023年6月13日
    091
  • JVM学习笔记之class文件结构【七】

    一、概念 1.1 无符号数: 以 u1、u2、u3、u4、u8 代表 1 个字节,2 个字节、4 个字节、8 个字节的无符号数。无符号数可以描述数字,索引引用、数量值和按照 UTF…

    Java 2023年6月5日
    063
  • idea的使用和插件

    1 修改对应的配置信息(缓存)地址 由于我家里的电脑C盘被我设置得超级小,然后Idea默认的各种系统配置,最主要是缓存的地址,修改${idea.home}/bin/idea.pro…

    Java 2023年6月7日
    0102
  • 职场升职之必备策略

    一、初入职场,在尽可能短的时间内记住每个同事的名字,给别人被重视的满足感。 二、搞清楚自己处于哪一个阶层,然后清楚地知道自己该往哪个方向努力,然后找出速腾的办法去实现它。 三、遇事…

    Java 2023年6月9日
    054
  • git ignore忽略规则

    Git 忽略文件提交的方法 Git 忽略规则 Git 忽略规则优先级 Git 忽略规则匹配语法 常用匹配示例 多级目录忽略规则设置 .gitignore规则不生效 参考文章 Git…

    Java 2023年6月13日
    087
  • Java基础 while 简单示例

    JDK :OpenJDK-11 OS :CentOS 7.6.1810 IDE :Eclipse 2019‑03 typesetting :Markdown code packag…

    Java 2023年5月29日
    0106
  • Javassist编译报错:Type long_2nd (current frame, stack[2]) is not assignable to ‘java/lang/Long’

    Caused by: compile error: invalid types for > at javassist.compiler.CodeGen.badTypes(Co…

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