力扣最新详解5道题:两数之和三数之和四数之和

news2024/10/7 14:28:43

目录

一、查找总价格为目标值的两个商品

题目

题解

方法一:暴力枚举

方法二:对撞指针

二、两数之和 

题目

题解

方法一:暴力枚举

方法二:哈希表法

三、三数之和

题目

题解

方法一:排序+暴力枚举+set去重

方法二:排序+双指针

四、四数之和

​题目

题解

方法一:排序+暴力枚举+set去重

方法二:排序+双指针

五、四数相加II

题目

题解

方法一:暴力枚举

方法二:两两合并


一、查找总价格为目标值的两个商品

题目

购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回任一结果即可。

示例 1:
输入:price = [3, 9, 12, 15], target = 18
输出:[3,15] 或者 [15,3]

示例 2:
输入:price = [8, 21, 27, 34, 52, 66], target = 61
输出:[27,34] 或者 [34,27]
 

提示:
1 <= price.length <= 10^5
1 <= price[i] <= 10^6
1 <= target <= 2*10^6

题解

方法一:暴力枚举

通过双层循环,在数组中依次遍历查找两数之和为目标值target的数组元素,需要注意i是从下标为0的位置开始循环,j不能与i重复查询,故j设置为从下标为1的位置开始循环,此方法的时间复杂度为O(n^2)。

class Solution {
    public int[] twoSum(int[] nums, int target) {
 
        int i = 0,j = 0,s[];
        for(i=0;i<nums.length;i++){
            for(j=i+1;j<nums.length;j++){
                if(nums[i]+nums[j] == target){
                      return new int[]{i, j};
                }
            }
        }
        return new int[0];
    }
}

方法二:对撞指针

本题是升序的数组,因此可以用「对撞指针」优化时间复杂度。算法流程如下:

  1. 初始化 left ,right 分别指向数组的左右两端(不是我们理解的指针,而是数组的下标);
  2. 当 left < right 的时候,一直循环
    1.  当 nums[left] + nums[right] == target 时,说明找到结果,记录结果,并且返回;
    2.  当 nums[left] + nums[right] < target 时,对于 nums[left] 而言,此时 nums[right] 相当于是 nums[left] 能碰到的最大值。如果此时不符合要求,我们可以让left++,使和变大
    3. 当 nums[left] + nums[right] > target 时,同理我们可以舍去nums[right] (因为和过大了,应该小一点)。让 right-- ,继续比较下一组数据,而 left 指针不变;
class Solution {
    public int[] twoSum(int[] nums, int target) {
        int i = 0, j = nums.length - 1;
        while(i < j) {
            int s = nums[i] + nums[j];
            if(s < target) i++;
            else if(s > target) j--;
            else return new int[] { nums[i], nums[j] };
        }
        return new int[0];
    }
}

二、两数之和 

题目

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]

提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案

本题与第一题区别在于:

  • 1、数组不是升序的,就不能使用对撞指针,即使你排序后,对应下标也不是原来的下标,当然也可以哈希映射
  • 2、返回值要返回下标,所以可以使用哈希映射 

题解

方法一:暴力枚举

此处省略。。。。

方法二:哈希表法

科普一下什么是哈希表,首先介绍一下哈希函数,哈希函数是一种根据函数和查找关键字key,直接确定出查找值所在位置的函数,而哈希表则是基于哈希函数所建立的一种查找表,它是由数组和链表组成的,通过键值对的方式存取数据,即【key,value】,通过哈希函数,它将key转换成对应的数组下标。

思考一下,方法一的暴力枚举法的时间复杂度之所以高,是因为代码中嵌套两层循环去遍历数组,那么有没有什么方法只需要遍历一次数组就可以得到最终的结果呢?分析可知,按照暴力枚举的思路,我们需要在数组中既找出num[i],又要找出num[j],然后才能判断两者之和是否等于target。

简化一下思维方式,其实我们也可以只遍历一次数组,得到每次数组下标为i处的元素的值,然后判断数组中是否包含某个元素满足:target-num[i]==num[j]即可。

因此,我们可以先创建一个哈希表,对于每一个num[i],去判断哈希表中是否有元素的值等于target-num[i],然后将num[i]的值插入哈希表中,这样就可以保证元素不会和自身匹配。搞清逻辑之后,下面来看一下代码实现,此时的时间复杂度为:O(n)。

package com.water.exec;

import java.util.*;

public class ArrayUtils {
    public static void main(String[] args) {
        test1();
    }


    public static void test1() {
        int[] arr = {-1, 4, 6, 3, -1, 2, 0, 1};
        System.out.print("原始的arr是");
        print(arr);
        sort(arr);
        findTwo(arr, 4);
    }

    public static void sort(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[i] > arr[j]) {
                    int tmp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = tmp;
                }
            }
        }
        System.out.print("排序之后的arr是");
        print(arr);
    }
    
    
    /*
     * 两数之和
     * */
    public static void findTwo(int[] arr, int target){
        Map<Integer, Integer> map = new HashMap<>();
        int[] res = new int[2];
        for (int i = 0; i < arr.length; i++) {
            int t = target - arr[i];
            if(map.containsKey(t)){
                res[0] = arr[i];
                res[1] = t;
                break;
            }
            map.put(arr[i], i);
        }
        System.out.print("两数之和:");
        print(res);
    }
    

    public static void print(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}

代码执行结果:

三、三数之和

题目

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:
输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:
输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

提示:
3 <= nums.length <= 3000
-105 <= nums[i] <= 105

题解

方法一:排序+暴力枚举+set去重

时间复杂度是O(n^3)。

方法二:排序+双指针

找的过程沿用之前的双指针的思路,因此本地可以认为是两数之和问题+去重操作。

思路如下:

  1. 数组排序
  2. 固定一个数num[i]
  3. 在该数后面的区间内,利用“双指针算法快速找到两个的和等于 -num[i] 即可
  4. 对于去重操作,额外进行

代码如下,

package com.water.exec;

import java.util.*;

public class ArrayUtils {
    public static void main(String[] args) {
        test1();
    }


    public static void test1() {
        int[] arr = {-1, 4, 6, 3, -1, 2, 0, 1};
        System.out.print("原始的arr是");
        print(arr);
        sort(arr);
        findThree(arr);
    }

    public static void sort(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[i] > arr[j]) {
                    int tmp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = tmp;
                }
            }
        }
        System.out.print("排序之后的arr是");
        print(arr);
    }

    /*
     * 三数之和
     * */
    public static void findThree(int[] arr){
        int len = arr.length;
        if(len < 3 || arr == null){  // 当前数组的长度为空,或者长度小于3时,直接退出
            return;
        }

        int mid_index = 0;  // 找到中间索引
        for (int i = 0; i < len; i++) {
            if(arr[i] >= 0){
                mid_index = i;
                break;
            }
        }

        List<List<Integer>> res = new ArrayList<>();
        for(int i = 0; i < mid_index; i++){
            if(arr[i] > 0){break;}
            if(i > 0 && arr[i] == arr[i-1]){  //去重,当起始的值等于前一个元素,那么得到的结果将会和前一次相同
                continue;
            }

            int left = i + 1;
            int right = len - 1;
            while(left < right){
                int sum = arr[i] + arr[left] + arr[right];
                if(sum == 0){
                    res.add(Arrays.asList(arr[i], arr[left], arr[right])); // 将三数的结果集加入到结果集中
                    //在将左指针和右指针移动的时候,先对左右指针的值,进行判断
                    //如果重复,直接跳过。
                    while (left < right && arr[left] == arr[left+1]){  //去重,因为i不变,当此时l取的数的值与前一个数相同,所以不用重复计算
                        left++;
                    }
                    while (left < right && arr[right] == arr[right-1]){  //去重,因为i不变,当此时r取的数的值与前一个相同,所以不用重复计算
                        right--;
                    }
                    left++;
                    right--;
                } else if (sum < 0) { // 如果结果小于0,说明当前l太小,将左指针右移
                    left++;
                } else {  // 如果结果大于0,说明当前r太大,将右指针左移
                    right--;
                }
            }
        }
        System.out.println("三数之和:" + res.toString());
    }
    


    public static void print(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}

代码执行结果: 

四、四数之和

​题目

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • abc 和 d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意顺序 返回答案 。

示例 1:
输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

示例 2:
输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]

提示:
1 <= nums.length <= 200
-109 <= nums[i] <= 109
-109 <= target <= 109

题解

方法一:排序+暴力枚举+set去重

找到出四个数之和等于target即可,但是下标不能相同,且是不重复的四元组,比如[-2,0,0,2]和[-2,2,0,0]是一样的,所以也告诉我们需要去掉重复值的。

时间复杂度是O(n^4),一定会超时。

方法二:排序+双指针

找的过程沿用之前的双指针的思路,因此本地可以认为是两数之和问题+去重操作。

思路如下:

  1. 首先先sort函数进行排序
  2. 还是和三数之和的算法原理相似,固定一个数a
  3. 在a后面的区间内,利用"三数之和“算法思路找到三个数,使这三个数的和等于target-a;
  4. 依次固定一个数 b
  5. 在b后面的区间内,利用”双指针“算法,快速找到2个数和为target-a-b
  6. 对于去重操作,额外进行

代码如下:

package com.water.exec;

import java.util.*;

public class ArrayUtils {
    public static void main(String[] args) {
        test1();
    }


    public static void test1() {
        int[] arr = {-1, 4, 6, 3, -1, 2, 0, 1};
        System.out.print("原始的arr是");
        print(arr);
        sort(arr);
        findThree(arr);
        findTwo(arr, 4);
        findFour(arr, 1);
    }

    public static void sort(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[i] > arr[j]) {
                    int tmp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = tmp;
                }
            }
        }
        System.out.print("排序之后的arr是");
        print(arr);
    }

    /*
     * 三数之和
     * */
    public static void findThree(int[] arr){
        int len = arr.length;
        if(len < 3 || arr == null){  // 当前数组的长度为空,或者长度小于3时,直接退出
            return;
        }

        int mid_index = 0;  // 找到中间索引
        for (int i = 0; i < len; i++) {
            if(arr[i] >= 0){
                mid_index = i;
                break;
            }
        }

        List<List<Integer>> res = new ArrayList<>();
        for(int i = 0; i < mid_index; i++){
            if(arr[i] > 0){break;}
            if(i > 0 && arr[i] == arr[i-1]){  //去重,当起始的值等于前一个元素,那么得到的结果将会和前一次相同
                continue;
            }

            int left = i + 1;
            int right = len - 1;
            while(left < right){
                int sum = arr[i] + arr[left] + arr[right];
                if(sum == 0){
                    res.add(Arrays.asList(arr[i], arr[left], arr[right])); // 将三数的结果集加入到结果集中
                    //在将左指针和右指针移动的时候,先对左右指针的值,进行判断
                    //如果重复,直接跳过。
                    while (left < right && arr[left] == arr[left+1]) left++; //去重,因为i不变,当此时l取的数的值与前一个数相同,所以不用重复计算
                    while (left < right && arr[right] == arr[right-1]) right--; //去重,因为i不变,当此时r取的数的值与前一个相同,所以不用重复计算
                    left++;
                    right--;
                } else if (sum < 0) { // 如果结果小于0,说明当前l太小,将左指针右移
                    left++;
                } else {  // 如果结果大于0,说明当前r太大,将右指针左移
                    right--;
                }
            }
        }
        System.out.println("三数之和:" + res.toString());
    }

    /*
    * 两数之和
    * */
    public static void findTwo(int[] arr, int target){
        Map<Integer, Integer> map = new HashMap<>();
        int[] res = new int[2];
        for (int i = 0; i < arr.length; i++) {
            int t = target - arr[i];
            if(map.containsKey(t)){
                res[0] = arr[i];
                res[1] = t;
                break;
            }
            map.put(arr[i], i);
        }
        System.out.print("两数之和:");
        print(res);
    }
    
    
    /*
    * 四数之和
    * */
    public static void findFour(int[] arr, int target) {
        int length = arr.length;
        if (arr == null || length < 4) return;  // 当前数组的长度为空,或者长度小于4时,直接退出

        List<List<Integer>> res = new ArrayList<>();
        for (int i = 0; i < length - 3; i++) {
            // 固定a
            if (i > 0 && arr[i] == arr[i - 1]) continue; //去重,当起始的值等于前一个元素,那么得到的结果将会和前一次相同
            if ((long) arr[i] + arr[i + 1] + arr[i + 2] + arr[i + 3] > target) break;  // 早停
            if ((long) arr[i] + arr[length - 3] + arr[length - 2] + arr[length - 1] < target) continue; // 早停
            // 找target-a
            for (int j = i + 1; j < length - 2; j++) {
                // 固定b
                if (j > i + 1 && arr[j] == arr[j - 1]) continue; //去重,当起始的值等于前一个元素,那么得到的结果将会和前一次相同
                if ((long) arr[i] + arr[j] + arr[j + 1] + arr[j + 2] > target) break; // 早停
                if ((long) arr[i] + arr[j] + arr[length - 2] + arr[length - 1] < target) continue; // 早停
                // 找target-a-b
                int left = j + 1, right = length - 1;
                while (left < right) {
                    long sum = (long) arr[i] + arr[j] + arr[left] + arr[right];
                    if (sum == target) {
                        res.add(Arrays.asList(arr[i], arr[j], arr[left], arr[right])); // 将三数的结果集加入到结果集中
                        while (left < right && arr[left] == arr[left + 1]) left++; //去重,因为i不变,当此时l取的数的值与前一个数相同,所以不用重复计算
                        left++;
                        while (left < right && arr[right] == arr[right - 1]) right--; //去重,因为i不变,当此时r取的数的值与前一个数相同,所以不用重复计算
                        right--;
                    }else if (sum < target) left++; // 如果结果小于target,说明当前l太小,将左指针右移
                    else right--; // 如果结果大于target,说明当前r太大,将右指针左移
                }
            }
        }
        System.out.println("四数之和:" + res.toString());
    }


    public static void print(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}

代码的执行结果:

五、四数相加II

题目

给你四个整数数组 nums1nums2nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:

  • 0 <= i, j, k, l < n
  • nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
示例 1:
输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]
输出:2
解释:
两个元组如下:
1. (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0
2. (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0

示例 2:
输入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]
输出:1
 
提示:
n == nums1.length
n == nums2.length
n == nums3.length
n == nums4.length
1 <= n <= 200
-228 <= nums1[i], nums2[i], nums3[i], nums4[i] <= 228

题解

方法一:暴力枚举

 对于这道题,我们的第一思路就是暴力枚举,我们可以写一个四层的for循环进行暴力匹配,只要相加的结果等于0就进行统计。但是我们会发现,我们的事件复杂度为O(N^4)事件复杂度非常大,所以如果使用这个思路进行问题的解决一定会超时,所以我们采用其他思路进行题目的解答操作。

方法二:两两合并

在官方题解当中我们可以学到一个解法:我们可以将四个数组分成为两个一组的形式,将一组当中的两个数组进行相加合并,将两个数组当中的元素进行完全匹配相加,合并之后就可以将两组新的数据进行匹配,之后就可以将题目的要求修改为两个数组查找指定的值。需要注意的是:我们同样需要使用哈希表进行数据的处理,以提高代码的运行速率。

本题是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况,即不用去重。

解题步骤:

  1. 定义一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。
  2. 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。
  3. 定义int变量count,用来统计 a+b+c+d = 0 出现的次数。
  4. 在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。
  5. 最后返回统计值 count 就可以了。。

我们会发现这种算法的时间复杂度为O(N^2),其主要需要进行的操作就是数组的合并,以及之后的数据查找操作。根据上述思路所编写的代码如下所示:

package com.water.exec;

import java.util.*;

public class ArrayUtils {
    public static void test4(){
        fourSumCount(new int[]{1, 2}, new int[]{-2, -1}, new int[]{-1, 2}, new int[]{0, 2});
    }

    
    /*
     * 四数相加II
     * */
    public static void fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        Map<Integer, Integer> map = new HashMap<>();
        int count = 0;
        for (int a : nums1){
            for (int b : nums2){
                int sum = a + b;
                //getOrDefault的第一个参数是key,第二个参数是自己设置的默认值(0),如果key存在则返回其出现次数,key不存在则返回0
                map.put(sum, map.getOrDefault(sum, 0) + 1);
            }
        }

        for (int c : nums3){
            for (int d : nums4){
                count += map.getOrDefault(0 - c - d, 0);
            }
        }
        System.out.println("四数相加II:" + count);
    }
}

代码的执行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JVM基础篇】垃圾回收

文章目录 垃圾回收常见内存管理方式手动回收&#xff1a;C内存管理自动回收(GC)&#xff1a;Java内存管理自动、手动回收优缺点 应用场景垃圾回收器需要对哪些部分内存进行回收&#xff1f;不需要垃圾回收器回收需要垃圾回收器回收 方法区的回收代码测试手动调用垃圾回收方法Sy…

二叉树第二期:堆的实现与应用

若对树与二叉树的相关概念&#xff0c;不太熟悉的同学&#xff0c;可移置上一期博客 链接&#xff1a;二叉树第一期&#xff1a;树与二叉树的概念-CSDN博客 本博客目标&#xff1a;对二叉树的顺序结构&#xff0c;进行深入且具体的讲解&#xff0c;同时学习二叉树顺序结构的应用…

Origin科学绘图软件最新版下载安装,Origin强大的科学研究工具

Origin软件&#xff0c;这款软件以其强大的数据分析和图形绘制功能&#xff0c;赢得了广大科研人员的青睐。无论是探索微观世界的化学研究&#xff0c;还是深究宏观现象的物理学分析&#xff0c;亦或是揭示生命奥秘的生物学探索&#xff0c;Origin软件都能为用户提供精准、高效…

Raccon:更好防侧信道攻击的后量子签名方案

1. 引言 安全社区已经开发出了一些出色的加密算法&#xff0c;这些算法非常安全&#xff0c;但最终&#xff0c;所有的数据都会被存储在硅和金属中&#xff0c;而入侵者越来越多地会在那里放置监视器来破解密钥。 破解加密密钥通常涉及暴力破解方法或利用实施过程中的缺陷。然…

linux ls文件排序

linux可以使用ls命令结合一些选项来按照文件大小对文件和目录进行排序。以下是一些常用的方法&#xff1a; 1、这里&#xff0c;-l 选项表示长格式输出&#xff08;包括文件权限、所有者、大小等&#xff09;&#xff0c;-S 选项表示按照文件大小排序&#xff0c;-h 选项表示以…

机器学习Python代码实战(一)线性回归算法

一.简单线性回归算法 简单线性回归算法的函数表达式一般为ykxb&#xff0c;需要拟合的变量是k和b。 1.导入库和数据集 2.读入数据集并以图表形式展示 分别为x轴和y轴设定标签值为area和price,其中读入的数据集csv文件是在项目的根目录下的文件夹dataset里。打印如图示。 至于…

昇思25天学习打卡营第5天|GAN图像生成

文章目录 昇思MindSpore应用实践基于MindSpore的生成对抗网络图像生成1、生成对抗网络简介零和博弈 vs 极大极小博弈GAN的生成对抗损失&#xff1a; 2、基于MindSpore的 Vanilla GAN3、基于MindSpore的手写数字图像生成导入数据数据可视化模型训练 Reference 昇思MindSpore应用…

【单片机毕业设计选题24034】-基于STM32的手机智能充电系统

系统功能: 系统可以设置充电时长&#xff0c;启动充电后按设置的充电时长充电&#xff0c;充电时间到后自动 停止充电&#xff0c;中途检测到温度过高也会结束充电并开启风扇和蜂鸣器报警。 系统上电后&#xff0c;OLED显示“欢迎使用智能充电系统请稍后”&#xff0c;两秒钟…

《强化学习的数学原理》(2024春)_西湖大学赵世钰 Ch8 值函数拟合 【基于近似函数的 TD 算法:Sarsa、Q-leaning、DQN】

PPT 截取有用信息。 课程网站做习题。总体 MOOC 过一遍 1、学堂在线 视频 习题 2、相应章节 过电子书 复习 【下载&#xff1a; 本章 PDF GitHub 页面链接】 3、 MOOC 习题 跳过的 PDF 内容 学堂在线 课程页面链接 中国大学MOOC 课程页面链接 B 站 视频链接 PPT和书籍下载网址…

大厂面试官问我:哨兵怎么实现的,Redis 主节点挂了,获取锁时会有什么问题?【后端八股文六:Redis集群八股文合集】

往期内容&#xff1a; 大厂面试官问我&#xff1a;Redis处理点赞&#xff0c;如果瞬时涌入大量用户点赞&#xff08;千万级&#xff09;&#xff0c;应当如何进行处理&#xff1f;【后端八股文一&#xff1a;Redis点赞八股文合集】-CSDN博客 大厂面试官问我&#xff1a;布隆过滤…

Shell 脚本编程保姆级教程(下)

七、Shell 流程控制 7.1 if #!/bin/bash num1100 if test $[num1] 100 thenecho num1 是 100 fi 7.2 if else #!/bin/bash num1100 num2100 if test $[num1] -eq $[num2] thenecho 两个数相等&#xff01; elseecho 两个数不相等&#xff01; fi 7.3 if else-if else #!/…

深度学习 - Transformer 组成详解

整体结构 1. 嵌入层&#xff08;Embedding Layer&#xff09; 生活中的例子&#xff1a;字典查找 想象你在读一本书&#xff0c;你不认识某个单词&#xff0c;于是你查阅字典。字典为每个单词提供了一个解释&#xff0c;帮助你理解这个单词的意思。嵌入层就像这个字典&#xf…

代码随想录-二叉搜索树(1)

目录 二叉搜索树的定义 700. 二叉搜索树中的搜索 题目描述&#xff1a; 输入输出示例&#xff1a; 思路和想法&#xff1a; 98. 验证二叉搜索树 题目描述&#xff1a; 输入输出示例&#xff1a; 思路和想法&#xff1a; 530. 二叉搜索树的最小绝对差 题目描述&#x…

IOS Swift 从入门到精通:ios 连接数据库 安装 Firebase 和 Firestore

创建 Firebase 项目 导航到Firebase 控制台并创建一个新项目。为项目指定任意名称。 在这里插入图片描述 下一步,启用 Google Analytics,因为我们稍后会用到它来发送推送通知。 在这里插入图片描述 在下一个屏幕上,选择您的 Google Analytics 帐户(如果已创建)。如果没…

java第三十课 —— 面向对象练习题

面向对象编程练习题 第一题 定义一个 Person 类 {name, age, job}&#xff0c;初始化 Person 对象数组&#xff0c;有 3 个 person 对象&#xff0c;并按照 age 从大到小进行排序&#xff0c;提示&#xff0c;使用冒泡排序。 package com.hspedu.homework;import java.util.…

使用slenium对不同元素进行定位实战篇~

单选框Radio定位&#xff1a; 单选框只能点击一个&#xff0c;并且点击之后并不会被取消&#xff0c;而多选框&#xff0c;能够点击多个&#xff0c;并且点击之后可以取消 import org.junit.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; imp…

基于python和opencv实现边缘检测程序

引言 图像处理是计算机视觉中的一个重要领域&#xff0c;它在许多应用中扮演着关键角色&#xff0c;如自动驾驶、医疗图像分析和人脸识别等。边缘检测是图像处理中的基本任务之一&#xff0c;它用于识别图像中的显著边界。本文将通过一个基于 Python 和 OpenCV 的示例程序&…

intellij idea安装R包ggplot2报错问题求解

1、intellij idea安装R包ggplot2问题 在我上次解决图形显示问题后&#xff0c;发现安装ggplot2包时出现了问题&#xff0c;这在之前高版本中并没有出现问题&#xff0c; install.packages(ggplot2) ERROR: lazy loading failed for package lifecycle * removing C:/Users/V…

Android 10.0 关于定制自适应AdaptiveIconDrawable类型的动态时钟图标的功能实现系列二(拖动到文件夹部分功能实现)

1.前言 在10.0的系统rom定制化开发中,在关于定制动态时钟图标中,原系统是不支持动态时钟图标的功能,所以就需要从新 定制动态时钟图标关于自适应AdaptiveIconDrawable类型的样式,就是可以支持当改变系统图标样式变化时,动态时钟 图标的背景图形也跟着改变,本篇实现在拖…

HBuilder X 小白日记02-布局和网页背景颜色

html&#xff1a; 例子1&#xff1a; 整个&#xff1a; css案例&#xff1a; 1.首先右键&#xff0c;创建css文件 2.在html文件的头部分&#xff0c;引用css&#xff0c;快捷方式&#xff1a;linkTab键 <link rel"stylesheet" href" "> 3.先在css…