数据结构与算法:滑动窗口类题目总结

滑动窗口类型题目解题框架总结:

class Solution:
    def problemName(self, s: str) -> int:
        # Step 1: 定义需要维护的变量们 (对于滑动窗口类题目,这些变量通常是最小长度,最大长度,或者哈希表)
        x, y = ..., ...


        # Step 2: 定义窗口的首尾端 (start, end), 然后滑动窗口
        start = 0
        for end in range(len(s)):
            # Step 3: 更新需要维护的变量, 有的变量需要一个if语句来维护 (比如最大最小长度)
            x = new_x
            if condition:
                y = new_y


            '''
            ------------- 下面是两种情况,读者请根据题意二选1 -------------
            '''
            # Step 4 - 情况1
            # 如果题目的窗口长度固定:用一个if语句判断一下当前窗口长度是否达到了限定长度 
            # 如果达到了,窗口左指针前移一个单位,从而保证下一次右指针右移时,窗口长度保持不变, 
            # 左指针移动之前, 先更新Step 1定义的(部分或所有)维护变量 
            if 窗口长度达到了限定长度:
                # 更新 (部分或所有) 维护变量 
                # 窗口左指针前移一个单位保证下一次右指针右移时窗口长度保持不变


            # Step 4 - 情况2
            # 如果题目的窗口长度可变: 这个时候一般涉及到窗口是否合法的问题
            # 如果当前窗口不合法时, 用一个while去不断移动窗口左指针, 从而剔除非法元素直到窗口再次合法
            # 在左指针移动之前更新Step 1定义的(部分或所有)维护变量 
            while 不合法:
                # 更新 (部分或所有) 维护变量 
                # 不断移动窗口左指针直到窗口再次合法


        # Step 5: 返回答案
        return ...

1、无重复字符的最长子串(leetcode-003)

给定一个字符串 ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 :
输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3// 双指针,滑动窗口(时间复杂度n)
    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public int lengthOfLongestSubstring(String s) {

            //判断处理空字符
            if (s==null || s.length() == 0){
                return 0;
            }
            // step1:定义需要维护的变量,最小子串数量,哈希表存储字符与字符位置
            int ans = 0;
            Map<Character, Integer> map = new HashMap<>();
            // step2:定义左右两个指针,滑动右指针
            for (int start = 0,end = 0;end<s.length();end++){
                char element = s.charAt(end);
                // step3:如果出现重复字符,则移动左指针,确保左指针必须右移,需要max筛选防止左移
                if (map.containsKey(element)){
                    start = Math.max(start,map.get(element)+1);
                }
                // step4:更新维护变量
                ans = Math.max(ans,end-start+1);
                map.put(element,end);
            }
            return ans;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

2.子数组最大平均数 I(leetcode-643)

给你一个由n个元素组成的整数数组nums和一个整数k 。
请你找出平均数最大且 长度为k的连续子数组,并输出该最大平均数。
示例:
输入:nums = [1,12,-5,-6,50,3], k = 4
输出:12.75
解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75
    /**
     * 滑动窗口套路题
     */
    class Solution {
        public double findMaxAverage(int[] nums, int k) {
            //定义需要维护的变量,求和与平均值
            double sum = 0;
            double max_avg = -999999;
            // 定义窗口首末端,并且滑动末端窗口
            for (int start=0,end=0;end<nums.length;end++){
                sum+=nums[end];
                //更新需要维护的变量
                if (end-start+1==k){
                    max_avg = Math.max(max_avg,sum / k);
                }
                // 窗口长度固定,则首指针前移,同时维护变量
                if (end>=k-1){
                    sum-=nums[start];
                    start+=1;
                }
            }
            //返回结果
            return max_avg;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

3.至多包含两个不同字符的最长子串(leetcode-159)

在这里插入图片描述

public static int lengthOfLongestSubstringTwoDistinct(String s) {
  //定义需要维护的变量,最长字串长度,map存储字符和位置
  int ans = 0;
  Map<Character,Integer> map = new HashMap<>();


  // 定义两个窗口两个指针,滑动末端指针
  for (int start=0,end=0;end<s.length();end++){
    //step3:更新维护变量,map存储字符与位置
    char element = s.charAt(end);
    map.put(element,end);
    if (map.size()<=2) {
      ans = Math.max(ans,end-start+1);
    }
    // step4:如果哈希表长度等于 说明出现三个重复字符,则获取最左字符位置+1作为左指针
    if (map.size() == 3){
      int delId = Collections.min(map.values());
      map.remove(s.charAt(delId));
      start = delId+1;
    }
    ans = Math.max(ans,end-start+1);
  }
  return ans;
}
public static void main(String args[]){

  String s = "ccaabbb";
  int data = new LengthOfLongestSubstringTwoDistinct().lengthOfLongestSubstringTwoDistinct(s);
  System.out.println(data);

}

4.长度最小的子数组(leetcode-209)

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长
度。如果不存在符合条件的子数组,返回 0 。

示例:
//输入:target = 7, nums = [2,3,1,2,4,3]
//输出:2
//解释:子数组 [4,3] 是该条件下的长度最小的子数组。

//输入:target = 11, nums = [1,1,1,1,1,1,1,1]
//输出:0
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int minSubArrayLen(int target, int[] nums) {

        // 定义需要维护的变量,包括最小长度和数组求和
        int ans = 999999,sum=0;
        // 定义数组首尾指针,并且滑动窗口(end指针移动)
        for (int start =0,end=0;end<nums.length;end++){
            // 更新需要维护的变量
            sum += nums[end];
            // 如果求和大于等于目标值则需要移动左指针,同时更新维护变量
            while(sum>=target){
                ans = Math.min(ans,end-start+1);
                sum -= nums[start];
                start+=1;
            }
        }
        if(ans==999999){
            return 0;
        }
        return ans;
    }
}

5.删除子数组的最大得分(leetcode-1659)

//给你一个正整数数组 nums ,请你从中删除一个含有 若干不同元素 的子数组。删除子数组的 得分 就是子数组各元素之 和 。返回 只删除一个 子数组可获得的 最大得分 。 如果数组 b 是数组 a 的一个连续子序列,即如果它等于 a[l],a[l+1],...,a[r] ,那么它就是 a 的一个子数组。

示例:
//输入:nums = [4,2,4,5,6]
//输出:17
//解释:最优子数组是 [2,4,5,6]
// 
//输入:nums = [5,2,1,2,5,2,1,2,5]
//输出:8
//解释:最优子数组是 [5,2,1] 或 [1,2,5]
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int maximumUniqueSubarray(int[] nums) {

        // step1:定义维护变量当前得分和最大得分
        int sum =0,sum_max = 0;
        Map<Integer,Integer> map = new HashMap<>();


        //step2:定义左右指针,并且移动右指针
        for (int start = 0,end =0;end<nums.length;end++){
            //step3:更新维护变量,哈希表验证是否存在重复值
            sum +=nums[end];
            map.put(nums[end],map.getOrDefault(nums[end],0)+1);
            // 判断不存在重复值,
            if (end-start+1 == map.size()){
                sum_max = Math.max(sum,sum_max);
            }
            //step4:如果子数组存在重复值,需要左侧收缩,直到窗口合法(确保窗口合法)
            while(end-start+1 > map.size()){
                int head = nums[start];
                map.put(head,map.get(head)-1);
                if (map.get(head)==0){
                    map.remove(head);
                }
                sum -= nums[start++];
            }
        }
        return  sum_max;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

6.找到字符串中所有字母异位词(leetcode-438)

//给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 
// 异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

示例:
//输入: s = "cbaebabacd", p = "abc"
//输出: [0,6]
//解释:
//起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
//起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public List<Integer> findAnagrams(String s, String p) {


        //step1:定义维护变量,存储结果数组以及哈希表对比字符串是否为异位词
        List<Integer> ans = new ArrayList();
        Map<Character,Integer> map = new HashMap<>();
        Map<Character,Integer> mapp = new HashMap<>();


        //step1.1:构建字符串p的哈希表
        for (int i=0;i<p.length();i++){
            mapp.put(p.charAt(i),mapp.getOrDefault(p.charAt(i),0)+1);
        }
        //step2:定义左右窗口指针,滑动右指针
        for (int start=0,end=0;end<s.length();end++){
            // step3:更新需要维护的变量,如果两个哈希表相等,则保存一个解
            map.put(s.charAt(end),map.getOrDefault(s.charAt(end),0)+1);
            if (map.equals(mapp)){
                ans.add(start);
            }


            //step4:由于窗口长度固定,if判断来维护固定长度窗口,并且左指针右移
            if (end-start+1>=p.length()){
                map.put(s.charAt(start),map.get(s.charAt(start))-1);
                if (map.get(s.charAt(start))==0){
                    map.remove(s.charAt(start));
                }
                start++;
            }
        }
        return ans;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

7. 字符串的排列(leetcode-567)


//给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。 
// 换句话说,s1 的排列之一是 s2 的 子串 。 

// 示例 1:
//输入:s1 = "ab" s2 = "eidbaooo"
//输出:true
//解释:s2 包含 s1 的排列之一 ("ba").

    /**
     * 思路:使用滑动窗口从s2中找到字符串s1的任意排列
     */


    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public boolean checkInclusion(String s1, String s2) {


            // step1:定义维护变量,哈希表存储字符串
            Map<Character,Integer> map = new HashMap<>();


            //step1.1:同时尽力字符串s1的哈希表
            Map<Character,Integer> maps1 = new HashMap<>();


            for (int i=0;i<s1.length();i++){
                maps1.put(s1.charAt(i),maps1.getOrDefault(s1.charAt(i),0)+1);
            }


            // step2:定义窗口左右指针,并且移动右指针
            for (int start=0,end=0;end<s2.length();end++){
                //step3:更新维护变量,判断两个map知否相等决定是否包含
                map.put(s2.charAt(end),map.getOrDefault(s2.charAt(end),0)+1);
                if (map.equals(maps1)){
                    return true;
                }
                //step4:由于窗口长度固定,因此用if判断维护固定窗口,同时左指针右移动
                if (end-start+1>=s1.length()){
                    //左指针移动,移动之前要更新维护变量
                    map.put(s2.charAt(start),map.get(s2.charAt(start))-1);
                    if (map.get(s2.charAt(start))==0){
                        map.remove(s2.charAt(start));
                    }
                    start++;
                }
            }
            return false;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

8. 最大连续1的个数(leetcode-487,1004)


给定一个二进制数组,你可以最多将 1,k个 0 翻转为 1,找出其中最大连续 1 的个数。
示例 1:
输入:[1,0,1,1,0]
输出:4
解释:翻转第一个 0 可以得到最长的连续 1。
     当翻转以后,最大连续 1 的个数为 4。
 

注:
输入数组只包含 01.
输入数组的长度为正整数,且不超过 10,000
    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public int longestOnes(int[] nums, int k) {
            //step1:定义维护变量,最大1个数以及哈希表统计0,1个数
            int max = 0;
            Map<Integer,Integer> map = new HashMap<>();
    
            // step2:定义左右指针,滑动右指针
            for (int start=0,end=0;end<nums.length;end++){
    
                //step3:更新维护变量,如果0的个数小于等于k则更新max
                map.put(nums[end],map.getOrDefault(nums[end],0)+1);
                if (map.getOrDefault(0,0)<=k){
                    max = Math.max(max,end-start+1);
                }
                //step4:窗口不固定,需要移动左指针确保窗口合法
                while(map.getOrDefault(0,0)>k){
                    map.put(nums[start],map.get(nums[start])-1);
                    start++;
                }
            }
            return max;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

9. 爱生气的老板(leetcode-1052)

有一个书店老板,他的书店开了 n 分钟。每分钟都有一些顾客进入这家商店。给定一个长度为 n 的整数数组 customers ,其中 customers[i] 是在第 i 分钟开始时进入商店的顾客的编号,所有这些顾客在第 i 分钟结束后离开。
在某些时候,书店老板会生气。 如果书店老板在第 i 分钟生气,那么 grumpy[i] = 1,否则 grumpy[i] = 0。
当书店老板生气时,那一分钟的顾客就会不满意,若老板不生气则顾客是满意的。书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续 minutes 分钟不生气,但却只能使用一次。请你返回 这一天营业下来,最多有多少客户能够感到满意 。

// 示例 1:

//输入:customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], minutes = 3
//输出:16
//解释:书店老板在最后 3 分钟保持冷静。
//感到满意的最大客户数量 = 1 + 1 + 1 + 1 + 7 + 5 = 16.

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public int maxSatisfied(int[] customers, int[] grumpy, int minutes) {

            //step1:定义需要维护的变量
            int sum = 0,maxsum = 0,startmax=0;
            //step2:定义窗口左右指针,滑动窗口移动右指针
            for (int start=0,end=0;end< customers.length;end++){
                //step3:更新需要维护的变量,确保minutes内让更多人满意
                if (grumpy[end]==1){
                    sum += customers[end];
                }
                if (maxsum<sum){
                    maxsum = sum;
                    startmax = start;
                }
                //step4:窗口长度,也就是在minutes分钟,窗口长度为minutes,用if确保窗口长度
                if (end-start+1 >= minutes){
                    if (grumpy[start] == 1){
                        sum -= customers[start];
                    }
                    start++;
                }
            }
            //step5:上述滑动窗口找到了老板开始生气的节点startmax;计算结果
            for (int i = startmax;i<startmax+minutes;i++){
                grumpy[i]=0;
            }
            int res = 0;
            for (int j = 0;j< customers.length;j++){
                if (grumpy[j]==0){
                    res+=customers[j];
                }
            }
            return res;


        }
    }
//leetcode submit region end(Prohibit modification and deletion)

10.可获得的最大点数(leetcode-1423)

//几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。
// 每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。
// 你的点数就是你拿到手中的所有卡牌的点数之和。
// 给你一个整数数组 cardPoints 和整数 k,请你返回可以获得的最大点数。

// 示例 1:
// 输入:cardPoints = [1,2,3,4,5,6,1], k = 3
//输出:12
//解释:第一次行动,不管拿哪张牌,你的点数总是 1 。但是,先拿最右边的卡牌将会最大化你的可获得点数。最优策略是拿右边的三张牌,最终点数为 1 + 6 + 5 = 12 。

/**
 * 本提要求首尾串的最大点数,也就是非首尾串的连续序列字串的最小和
 */
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int maxScore(int[] cardPoints, int k) {


        //step0:特解
        if (k==cardPoints.length){
            return Arrays.stream(cardPoints).sum();
        }
        //step1:定义需要维护的变量,m表示连续字串的窗口大小
        int m = cardPoints.length-k;
        int min_sum = Integer.MAX_VALUE,sum=0;


        // step3:定义左右指针,移动窗口
        for (int start=0,end=0;end<cardPoints.length;end++){


            // step4:更新维护变量
            sum += cardPoints[end];
            //step5:窗口长度固定,用if判断维护窗口合法,并且移动左指针
            if (end-start+1>=m){
                min_sum = Math.min(min_sum,sum);
                sum -= cardPoints[start];
                start++;
            }
        }
        int sumlist = 0;
        for (int j= 0;j<cardPoints.length;j++){
            sumlist+=cardPoints[j];
        }


        return sumlist-min_sum;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/3932.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Node.js学习笔记——Node.js模块化

一、介绍 1.1.什么是模块化与模板&#xff1f; 将一个复杂的程序文件依据一定规则&#xff08;规范&#xff09;拆分成多个文件的过程称之为模块化。 其中拆分出的每个文件就是一个模块&#xff0c;模块的内部数据是私有的&#xff0c;不过模块可以暴露内部数据以便其他模块…

【树与二叉树】二叉树顺序结构实现以及堆的概念及结构--详解介绍

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录1. 二叉树顺序结构2.…

Elasticsearch:Elasticsearch 容量规划

Elasticsearch 是一个可扩展的分布式系统&#xff0c;可为企业搜索、日志聚合、可观察性和安全性提供解决方案。 Elastic 解决方案建立在一个单一、灵活的技术堆栈之上&#xff0c;可以部署在任何地方。 要在自托管或云端运行生产环境 Elasticsearch&#xff0c;需要规划基础架…

Linux硬链接与软链接

图示区别 硬链接 具有相同inode节点号的多个文件互为硬链接文件&#xff1b;删除硬链接文件或者删除源文件任意之一&#xff0c;文件实体并未被删除&#xff1b;只有删除了源文件和所有对应的硬链接文件&#xff0c;文件实体才会被删除&#xff1b;硬链接文件是文件的另一个入…

贯穿设计模式第四话--里氏替换原则

&#x1f973;&#x1f973;&#x1f973; 茫茫人海千千万万&#xff0c;感谢这一刻你看到了我的文章&#xff0c;感谢观赏&#xff0c;大家好呀&#xff0c;我是最爱吃鱼罐头&#xff0c;大家可以叫鱼罐头呦~&#x1f973;&#x1f973;&#x1f973; 从今天开始&#xff0c;将…

关于位运算的巧妙性:小乖,你真的明白吗?

一.位运算的概念什么是位运算&#xff1f;程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。位运算就是直接操作二进制数&#xff0c;那么有哪些种类的位运算呢&#xff1f;常见的运算符有与(&)、或(|)、异或(^)、…

软硬结合板设计,过孔到软板区域的间距设计多少合适

一博高速先生成员&#xff1a;王辉东 十里樱花香无边&#xff0c; 满枝芳华尽娇艳。 春风不知少年心&#xff0c; 红粉树下看如烟。 周六的下午&#xff0c;赵理工推开窗&#xff0c;一阵香风袭来&#xff0c;空气中氤氲着樱花的气息。樱花开得浪漫&#xff0c;恰似少年的…

[致敬未来的攻城狮计划 1] 使用 “FSP Configuration”(FSP 配置)透视配置器设置运行环境

开启攻城狮的成长之旅&#xff01;这是我参与的由 CSDN博客专家 架构师李肯&#xff08;http://yyds.recan-li.cn&#xff09;和 瑞萨MCU &#xff08;瑞萨电子 (Renesas Electronics Corporation) &#xff09; 联合发起的「 致敬未来的攻城狮计划 」的第 4 天&#xff0c;点击…

动态规划-不相交的线

动态规划-不相交的线 前言 动态规划中存在一类问题&#xff0c;它涉及到两个数组或链表&#xff0c;需要求解出两个数组中的最长公共子序列&#xff0c;如果要求解两个数组的最长公共子序列。如果采取最原始的方式&#xff0c;选择对第一个数组中的元素的不同排列进行有序组合…

Excel:vlookup函数

Excel:VlookUp函数VlookUp函数VlookUp函数 首先还是先放官方文档的参考&#xff1a;VLOOKUP 函数 Vlookup函数参数&#xff1a; VLOOKUP(lookup_ value, table_ array, col index_ num, [range_ lookup]) lookup_ value&#xff1a;要查找的内容&#xff1b; table_ array&a…

CloudCompare 二次开发(6)——插件中拖拽添加Qt窗口(区域生长算法为例)

目录 一、概述二、插件制作三、Cmake编译四、插件代码五、结果展示一、概述 手动拖拽的方式搭建Qt对话框界面的制作流程,以PCL中的点云区域生长算法为例进行制作。 二、插件制作 1、将....\plugins\example路径下的ExamplePlugin复制一份并修改名字为CCPointCloudProcess。 …

大数据之Spark基础环境

文章目录前言一、Spark概述&#xff08;一&#xff09;Spark是什么&#xff08;二&#xff09;Spark的四大特点&#xff08;三&#xff09;Spark的风雨十年&#xff08;四&#xff09;Spark框架模块&#xff08;五&#xff09;Spark通信框架总结前言 #博学谷IT学习技术支持# 本…

【lwIP(第四章)】网络接口

目录一、lwIP网络接口简介二、lwIP的netif结构三、lwIP的netif相关函数1. lwIP网络接口的全局变量2. netif_add()函数3. netif_remove()函数4. netif_set_default()函数一、lwIP网络接口简介 lwIP协议栈支持多种不同的网络接口&#xff08;网卡&#xff09;&#xff0c;由于网卡…

OSPF----优化

优化主要目的---减少LSA的更新量以及数量 路由汇总&#xff08;减少骨干区域的LSA更新量&#xff09;OSPF特殊秋雨&#xff08;减少非骨干区域的LSA更新量&#xff09;OSPF路由汇总&#xff08;路由聚合&#xff09; OSPF路由汇总是由手工部署的OSPF的汇总称为---区域汇总&…

Swagger快速入门【基础总结】

Swagger 背景信息 什么是前后端分离&#xff1a; 即: Vue Springboot 开发模式 以前是后端时代(后端是主力)&#xff1a;前端只用管理静态页面&#xff1b;html—>后端。 前后端分离时代&#xff1a; 前端 &#xff1a;前端控制层、视图层【前端团队】后端&#xff1a;后…

客户端安装SSH工具Xshell图解

一、客户端安装SSH工具 windows客户端&#xff1a;安装Putty、XShell 或者 SecureCRT Linux客户端&#xff1a;yum install openssh-clients macOS客户端&#xff1a;默认已经安装了SSH客户端 我们这里安装windows客户端&#xff0c;选择XShell 工具。 Xshell5、Xftp5下载&am…

Linux系统之安装PostgreSQL数据库

Linux系统之安装PostgreSQL数据库一、PostgreSQL介绍1.PostgreSQL简介2.PostgreSQL特点二、本次实践介绍1.本次实践介绍2.实践环境介绍三、配置PostgreSQL的yum仓库源1.检查本地是否部署PostgreSQL2.配置镜像源3.检查yum仓库镜像源状态四、安装PostgreSQL1.安装PostgreSQL2.初始…

GPIO的八种模式分析

GPIO是general purpose input output,即通用输入输出端口&#xff0c;作用是负责外部器件的信息和控制外部器件工作。 GPIO有如下几个特点&#xff1a;1.不同型号的IO口数量不同&#xff1b;2&#xff0c;反转快速&#xff0c;每次翻转最快只需要两个时钟周期&#xff0c;以ST…

dubbo的SPI机制和服务暴露,引用原理

一、SPI引入&#xff1a;spi标准&#xff1a;1、需要在 classpath 下创建一个目录&#xff0c;该目录命名必须是&#xff1a;META-INF/service2、在该目录下创建一个 properties 文件&#xff0c;该文件需要满足以下几个条件 &#xff1a;2.1 文件名必须是扩展的接口的全路径名…

量子运算-比算子描述更广泛的一类刻画量子态在客观世界演化的数学工具

参考链接&#xff1a;1.1 量子运算 - 知乎 (zhihu.com)一个量子操作&#xff08;包括量子测量和量子信道&#xff09;指的是把一个密度矩阵变成另一个密度矩阵的变换&#xff0c;一般记为 背景演化算符是酉的。这里考虑考虑特殊的演化-测量。测量对应的算子是投影算子&#xff…