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

目录

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

题目

题解

方法一:暴力枚举

方法二:对撞指针

二、两数之和 

题目

题解

方法一:暴力枚举

方法二:哈希表法

三、三数之和

题目

题解

方法一:排序+暴力枚举+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++) {// 固定aif (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-afor (int j = i + 1; j < length - 2; j++) {// 固定bif (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-bint 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不存在则返回0map.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.mzph.cn/news/863577.shtml

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

相关文章

数据资产治理的智能化探索:结合云计算、大数据、人工智能等先进技术,探讨数据资产治理的智能化方法,为企业提供可靠、高效的数据资产解决方案,助力企业提升竞争力

一、引言 在信息化时代&#xff0c;数据已成为企业最重要的资产之一。随着云计算、大数据、人工智能等先进技术的飞速发展&#xff0c;数据资产治理面临着前所未有的机遇与挑战。本文旨在探讨如何结合这些先进技术&#xff0c;实现数据资产治理的智能化&#xff0c;为企业提供…

【活动感想】筑梦之旅·AI共创工坊 workshop 会议回顾

目录 &#x1f30a;1. 会议详情 &#x1f30a;2. 会议回顾 &#x1f30d;2.1 主持人开场 &#x1f30d;2.2 元甲-小当家 AI 驱动的创意儿童营养早餐料理机&今天吃什么App &#x1f30d;2.3 Steven- A l 心理疗愈认知 &#x1f30d;2.4 伯棠-诸子百家(xExperts)-多智能…

C++ 文件读写

目录 一、XML文件读写 1、写入XML文件 2、读取XML文件 二、JSON文件读写 1、写入JSON文件 2、读取JSON文件 3、写入JSON文件 4、读取JSON文件 三、CSV文件读写 1、写入CSV文件 2、读取CSV文件 四、Excel文件读写 1、写入Excel文件 2、读取Excel文件 五、INI文件读…

转盘输入法-总

序 转盘输入法&#xff0c;给你的聊天加点新意。它不用常见的九宫格或全键盘&#xff0c;而是把字母摆在圆盘上&#xff0c;一滑一滑&#xff0c;字就出来了&#xff0c;新鲜又直接。 PC屏幕键盘的对比 鉴于屏幕键盘这一新颖界面的局限性&#xff0c;当用户在操作时&#xff…

015、HBase分布式数据库与传统数据库的深度对比

目录 HBase分布式数据库与传统数据库的深度对比 1. 数据模型 1.1 传统关系型数据库 1.2 HBase 2. 扩展性 2.1 传统关系型数据库 2.2 HBase 3. 查询语言 3.1 传统关系型数据库 3.2 HBase 4. 事务支持 4.1 传统关系型数据库 4.2 HBase 5. 数据一致性 5.1 传统关系型…

STM32 HAL库里 串口中断回调函数是在怎么被调用的?

跟着正点原子学习的HAL库写串口接收程序的时候一直有困惑&#xff0c;使用HAL_UART_Receive_IT开启接收中断后&#xff0c;为啥处理函数要写在HAL_UART_RxCpltCallback里&#xff0c;中断发生的时候是怎么到这个回调函数里去的&#xff1f; void MX_USART1_UART_Init(void) {h…

Elasticsearch环境搭建|ES单机|ES单节点模式启动|ES集群搭建|ES集群环境搭建

文章目录 版本选择单机ES安装与配置创建非root用户导入安装包安装包解压配置JDK环境变量配置single-node配置JVM参数后台启动|启动日志查看启动成功&#xff0c;访问终端访问浏览器访问 Kibana安装修改配置后台启动|启动日志查看浏览器访问 ES三节点集群搭建停止es服务域名配置…

C++面试题精选-2024/06/26

堆分配会比栈快吗 堆分配和栈分配在速度上并不直接可比,因为它们服务于不同的目的和场景,具有不同的特性和优势。以下是关于堆分配和栈分配速度方面的详细分析: 数据结构: 栈是一种线性数据结构,遵循先进后出(LIFO)的原则。堆则是一种树状的数据结构,允许随机插入和删…

【SGX系列教程】(二)第一个 SGX 程序: HelloWorld,linux下运行

文章目录 0. SGX基础原理分析一.准备工作1.1 前提条件1.2 SGX IDE1.3 基本原理 二.程序设计2.1 目录结构2.2 源码设计2.2.1 Encalve/Enclave.edl:Enclave Description Language2.2.2 Enclave/Enclave.lds: Enclave linker script2.2.3 Enclave/Enclave.config.xml: Enclave 配置…

Elasticsearch 管道聚合:组合多个聚合

在Elasticsearch中&#xff0c;聚合&#xff08;Aggregations&#xff09;是处理和分析大量数据的关键工具。通过聚合&#xff0c;我们可以从海量的数据中提取出有价值的统计信息&#xff0c;如最大值、最小值、平均值、总和等。然而&#xff0c;有时单一聚合无法满足我们复杂的…

C语言之字符串存储差异分析

C语言之字符串存储差异分析 字符串字符串字面量字符数组动态分配字符串 结语 字符串 在C语言中&#xff0c;可以使用多种方式来创建字符串。但是&#xff0c;不同创建方式之间的区别&#xff0c;你了解么&#xff1f;。 字符串字面量 C语言 -- 字符串字面量创建方式 char *s…

Games101学习笔记 Lecture 14: Ray Tracing 2 (Acceleration Radiometry)

Lecture 14: Ray Tracing 2 (Acceleration & Radiometry 一、加速光线追踪 AABB1.均匀网格 Uniform Spatial Partitions (Grids)①前处理-构建加速网格②射线与场景相交③网格分辨率④适用情况 2.空间划分KD-Tree①预处理②数据结构③遍历④问题 3.对象划分 & 包围盒层…

Lua: 轻量级多用途脚本语言

Lua 是一种高效而轻量级的脚本语言&#xff0c;具备强大的扩展性和灵活性&#xff0c;广泛应用于游戏开发、嵌入式系统、Web 应用等多个领域。本文将深入探讨 Lua 的特性、应用场景以及如何使用 Lua 进行开发。 1. Lua 的起源与发展 Lua 的发展始于上世纪90年代初&#xff0c;…

【微代码】Linux同步机制complete基本用法,以及如何封装一个内核态sleep的工具函数ksleep?

文章目录 背景基本代码和用法内核态sleep效果其他 背景 Linux提供了多种同步机制&#xff0c;其中complete就是一种。complete能够阻塞等待状态同步&#xff0c;并且等待对方释放中会调用schedule让出CPU。如果想在内核中等待一个固定时长继续执行他是一个非常不错的选择。有点…

为什么明明引入依赖了却总是爆红说不认识?

把maven中的依赖部分dependencies删掉&#xff0c;重新刷新一遍&#xff0c;再粘贴回去&#xff0c;重新刷新一遍就可以了

Spark SQL----分布式SQL引擎

Spark SQL----分布式SQL引擎 一、运行Thrift JDBC/ODBC服务器二、运行Spark SQL CLI2.1 Spark SQL命令行选项2.2 hiverc文件2.3 路径的说明2.4 支持的注释类型2.5 Spark SQL CLI交互式Shell命令2.6 例子 Spark SQL还可以使用JDBC/ODBC或命令行接口充当分布式查询引擎。在这种模…

mysql8一键安装脚本(linux) 拿走即用

创建一个shell文件,将下面的代码放里面去,然后放到linux服务器上运行就可以了 #!/bin/bash#---------------------* # * # 2021-10-08 * # install mysql-8 * # * #---------------------*route=/usr #包存放路径 mys…

掌握 Vue 组件通信:打造高效、灵活的前端应用

一、引言 Vue.js&#xff0c;作为现代前端开发的热门框架&#xff0c;以其组件化架构引领了开发效率与代码维护性的新标准。组件通信&#xff0c;作为这一架构中的关键环节&#xff0c;对于构建响应式、可扩展的应用至关重要。本文将探讨 Vue 组件通信的多种策略&#xff0c;旨…

c++习题04-忙碌的工人

目录 一&#xff0c;问题 二&#xff0c;思路 1&#xff0c;图形 2&#xff0c;分析 3&#xff0c;伪代码 三&#xff0c;代码 一&#xff0c;问题 二&#xff0c;思路 1&#xff0c;图形 根据题目&#xff0c;绘制出来的图形如下&#x1f447; 之后再绘制甲经过楼梯…

【数据结构】--栈

&#x1f44c;个人主页: 起名字真南 &#x1f923;个人专栏:【数据结构初阶】 【C语言】 目录 1 栈1.1 栈的概念和结构1.2 栈的实现1.2.1 头文件1.2.2 初始化1.2.3 销毁1.2.4 打印所有元素1.2.5 入栈1.2.6 出栈1.2.7 获取栈顶数据1.2.8 判空1.2.9 获取元素个数 1 栈 1.1 栈的概…