双指针算法专题

前言

双指针算法入门,干就完了

下面的题目都是来自灵神的基础算法精讲,有思路不清晰的地方,可以去看讲解。

灵茶山艾府的个人空间-灵茶山艾府个人主页-哔哩哔哩视频 (bilibili.com)

相向双指针

1.两数之和

题目链接:167. 两数之和 II - 输入有序数组 - 力扣(LeetCode)

题目描述

给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1]numbers[index2] ,则 1 <= index1 < index2 <= numbers.length

以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1index2

你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。

你所设计的解决方案必须只使用常量级的额外空间。

示例 1:

输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。

示例 2:

输入:numbers = [2,3,4], target = 6
输出:[1,3]
解释:2 与 4 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。

示例 3:

输入:numbers = [-1,0], target = -1
输出:[1,2]
解释:-1 与 0 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。

提示:

  • 2 <= numbers.length <= 3 * 104
  • -1000 <= numbers[i] <= 1000
  • numbers非递减顺序 排列
  • -1000 <= target <= 1000
  • 仅存在一个有效答案

代码

C++
class Solution {
public:vector<int> twoSum(vector<int>& numbers, int target) {int n = numbers.size();int left = 0;int right = n - 1;while (left < right) {int s = numbers[left] + numbers[right];if (s == target) {break;} else if (s > target) {right -= 1;} else {left += 1;}}return {left + 1, right + 1};}
};
Java
class Solution {public int[] twoSum(int[] numbers, int target) {int n = numbers.length;int[] res = new int[2]; // 定义数组,用于最终答案的存储int left = 0;int right = n - 1;while (left < right) {int s = numbers[left] + numbers[right];if (s == target) {res[0] = left + 1;res[1] = right + 1;break;} else if (s > target) {right -= 1;} else {left += 1;}}return res;}
}

2.三数之和

题目链接:15. 三数之和 - 力扣(LeetCode)

题目描述

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != 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

代码

C++
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(), nums.end()); // 对nums数组排序vector<vector<int>> ans;        // 最终结果int n = nums.size();            // nums数组的长度for (int i = 0; i < n - 2; i++) { // i < n - 2是要给left、right留下位置int x = nums[i];if (i && x == nums[i - 1])continue; // 跳过重复数字if (x + nums[i] + nums[i + 1] > 0)break; // 因为nums是排好序的,数组的前三个数相加都大于0了,那么后面的数字相加不可能等于0if (x + nums[n - 1] + nums[n - 2] < 0)continue; // 如果当前的x与最大的两个数相加小于0,那么x与中间的任意数字相加都小于0,直接可以枚举下一个x了。int left = i + 1;int right = n - 1;while (left < right) {int s = x + nums[left] + nums[right]; // 先计算出三者相加的结果if (s > 0)right--; // s > 0的话,代表右边的数大了,所以右指针左移else if (s < 0)left++; // s < 0的话,代表左边的数小了,所以左指针右移else {ans.push_back({x, nums[left], nums[right]});left++;while (left < right &&nums[left] == nums[left - 1]) { // 跳过重复数字left++;}right--;while (right > left &&nums[right] == nums[right + 1]) { // 跳过重复数字right--;}}}}return ans;}
};
Java
class Solution {public List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums); // 数组排序List<List<Integer>> ans = new ArrayList<>(); // 最终结果int n = nums.length; // 数组长度for (int i = 0; i < n - 2; i++) { // 遍历数组,留出位置给左右指针int x = nums[i];if (i > 0 && x == nums[i - 1])continue; // 跳过重复数字if (x + nums[i + 1] + nums[i + 2] > 0)break; // 如果前三个数相加已经大于0,后面的数字相加不可能等于0if (x + nums[n - 1] + nums[n - 2] < 0)continue; // 如果当前数字与最大的两个数字相加小于0,直接枚举下一个数字int left = i + 1;int right = n - 1;while(left < right){int s = x + nums[left] + nums[right];if(s > 0) right--; // 右指针左移else if(s < 0) left++; // 左指针右移else{ans.add(List.of(x,nums[left],nums[right]));left++;while (left < right && nums[left] == nums[left - 1]) {left++; // 跳过重复数字}right--;while (right > left && nums[right] == nums[right + 1]) {right--; // 跳过重复数字}}}}return ans;}
}

3.最接近的三数之和

题目链接:16. 最接近的三数之和 - 力扣(LeetCode)

题目描述

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。

示例 1:

输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

示例 2:

输入:nums = [0,0,0], target = 1
输出:0

提示:

  • 3 <= nums.length <= 1000
  • -1000 <= nums[i] <= 1000
  • -104 <= target <= 104

优化来自灵神,不得不说,灵神yyds,下面为灵神的题解

16. 最接近的三数之和 - 力扣(LeetCode)

代码

C++
class Solution {
public:int threeSumClosest(vector<int>& nums, int target) {sort(nums.begin(),nums.end());int n = nums.size();int minDiff = INT_MAX;int ans = 0;for (int i = 0; i < n - 2; i++) {int x = nums[i];// 优化三if(i > 0 && x == nums[i - 1]){continue;}// 优化一int res = x + nums[i+1] + nums[i+2];if(res > target){ // 后面无论怎么选,选出的三个数的和不会比res小if(res - target < minDiff){ans = res;}break;}// 优化二res = x + nums[n - 1] + nums[n - 2];if(res < target){ // x 加上后面任意两个数都不超过 s,所以下面的双指针就不需要跑了if(target - res < minDiff){minDiff = target - res;ans = res;}continue;}// 双指针int left = i + 1, right = n - 1;while (left < right) {int res = x + nums[left] + nums[right];if (res == target) {return target;} else if (res < target) {if (target - res < minDiff) { // 找到更接近 target 的数minDiff = target - res;ans = res;}left++;} else {// res > targetif (res - target < minDiff) { // 找到更接近 target 的数minDiff = res - target;ans = res;}right--;}}}return ans;}
};
Java
class Solution {public int threeSumClosest(int[] nums, int target) {Arrays.sort(nums);int n = nums.length;int minDiff = Integer.MAX_VALUE;int ans = 0;for (int i = 0; i < n - 2; i++) {int x = nums[i];// 优化三if (i > 0 && x == nums[i - 1]) {continue;}// 优化一int res = x + nums[i + 1] + nums[i + 2];if (res > target) { // 后面无论怎么选,选出的三个数的和不会比res小if (res - target < minDiff) {ans = res;}break;}// 优化二res = x + nums[n - 1] + nums[n - 2];if (res < target) { // x 加上后面任意两个数都不超过 s,所以下面的双指针就不需要跑了if (target - res < minDiff) {minDiff = target - res;ans = res;}continue;}// 双指针int left = i + 1, right = n - 1;while (left < right) {res = x + nums[left] + nums[right];if (res == target) {return target;} else if (res < target) {if (target - res < minDiff) { // 找到更接近 target 的数minDiff = target - res;ans = res;}left++;} else { // res > targetif (res - target < minDiff) { // 找到更接近 target 的数minDiff = res - target;ans = res;}right--;}}}return ans;}
}

4.盛最多水的容器

题目链接:11. 盛最多水的容器 - 力扣(LeetCode)

题目描述

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0)(i, height[i])

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

**说明:**你不能倾斜容器。

示例 1:

img

输入:[1,8,6,2,5,4,8,3,7]
输出:49 
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例 2:

输入:height = [1,1]
输出:1

提示:

  • n == height.length
  • 2 <= n <= 105
  • 0 <= height[i] <= 104

代码

C++
class Solution {
public:int maxArea(vector<int>& height) {int n = height.size();int left = 0;int right = n - 1;int res = 0,area = 0;while(left < right){area = (right - left) * min(height[left],height[right]);res = max(res,area);if(height[left] < height[right]){left++;} else {right--;}}return res;}
};
Java
class Solution {public int maxArea(int[] height) {int n = height.length;int left = 0;int right = n - 1;int res = 0;while(left < right){int area = Math.min(height[left],height[right]) * (right - left);res = Math.max(res,area);if(height[left] < height[right]){left++;}else{right--;}}return res;}
}

5.接雨水

题目链接:42. 接雨水 - 力扣(LeetCode)

题目描述

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例 1:

img

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 

示例 2:

输入:height = [4,2,0,3,2,5]
输出:9

提示:

  • n == height.length
  • 1 <= n <= 2 * 104
  • 0 <= height[i] <= 105

代码

C++
class Solution {
public:int trap(vector<int>& height) {int n = height.size();int left = 0, right = n - 1;int pre_max = 0, suf_max = 0;int ans = 0;while (left < right) {pre_max = max(pre_max, height[left]); // 更新前缀最大值suf_max = max(suf_max, height[right]); // 更新后缀最大值if (pre_max < suf_max) { // 柱子雨水高度是该柱子前后缀最高柱子的较小者ans += pre_max - height[left]; // 当前位置雨水高度减去柱子高度left++; // 左指针右移} else {ans += suf_max - height[right]; // 当前位置雨水高度减去柱子高度right--; // 右指针左移}}return ans;}
};
Java
class Solution {public int trap(int[] height) {int n = height.length;int left = 0, right = n - 1;int pre_max = 0, suf_max = 0;int ans = 0;while (left < right) {pre_max = Math.max(pre_max, height[left]); // 更新前缀最大值suf_max = Math.max(suf_max, height[right]); // 更新后缀最大值if (pre_max < suf_max) { // 柱子雨水高度是该柱子前后缀最高柱子的较小者ans += pre_max - height[left]; // 当前位置雨水高度减去柱子高度left++; // 左指针右移} else {ans += suf_max - height[right]; // 当前位置雨水高度减去柱子高度right--; // 右指针左移}}return ans;}
}

同向双指针(滑动窗口)

1.长度最小的子数组

题目链接:209. 长度最小的子数组 - 力扣(LeetCode)

题目描述

给定一个含有 n 个正整数的数组和一个正整数 target

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

示例 1:

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

示例 2:

输入:target = 4, nums = [1,4,4]
输出:1

示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

提示:

  • 1 <= target <= 109
  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 105

思路

滑动窗口

代码

C++
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int n = nums.size();int ans = n + 1;int left = 0, s = 0;for (int right = 0; right < n; right++) {s += nums[right];while (s >= target) {ans = min(ans, right - left + 1);s -= nums[left];left++;}}return ans <= n ? ans : 0;}
};
Java
class Solution {public int minSubArrayLen(int target, int[] nums) {int n = nums.length;int ans = n+1;int left = 0, s = 0;for(int right = 0;right < n; right++){s += nums[right];while(s >= target){ans = Math.min(ans, right - left +1);s -= nums[left];left++;}}return ans <= n ? ans : 0;}
}

2.乘积小于K的子数组

题目链接:713. 乘积小于 K 的子数组 - 力扣(LeetCode)

题目描述

给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目。

示例 1:

输入:nums = [10,5,2,6], k = 100
输出:8
解释:8 个乘积小于 100 的子数组分别为:[10]、[5]、[2],、[6]、[10,5]、[5,2]、[2,6]、[5,2,6]。
需要注意的是 [10,5,2] 并不是乘积小于 100 的子数组。

示例 2:

输入:nums = [1,2,3], k = 0
输出:0

提示:

  • 1 <= nums.length <= 3 * 104
  • 1 <= nums[i] <= 1000
  • 0 <= k <= 106

思路

滑动窗口

代码

C++
class Solution {
public:int numSubarrayProductLessThanK(vector<int>& nums, int k) {int n = nums.size();int ans = 0; // 结果int left = 0;int s = 1;if(k <= 1){return 0;}for(int right = 0; right < n; right++){s *= nums[right];while( s >= k){s /= nums[left];left++;}ans += right - left + 1;}return ans;}
};
Java
class Solution {public int numSubarrayProductLessThanK(int[] nums, int k) {int n = nums.length;int ans = 0;int s = 1;int left = 0;if(k <= 1){return 0;}for(int right = 0;right < n; right++){s *= nums[right];while(s >= k){s /= nums[left];left++;}ans += right - left + 1;}return ans;}
}

3.无重复字符的最长子串

题目链接:3. 无重复字符的最长子串 - 力扣(LeetCode)

题目描述

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

思路

滑动窗口

代码

C++
class Solution {
public:int lengthOfLongestSubstring(string s) {int n = s.length();int ans = 0, left = 0;unordered_set<char> window; // 维护当前子串的字符集合for (int right = 0; right < n; right++) {char c = s[right];while (window.count(c)) {window.erase(s[left]);left++;}window.insert(c);ans = max(ans, right - left + 1);}return ans;}
};
Java
class Solution {public int lengthOfLongestSubstring(String s) {int n = s.length();int ans = 0, left = 0;HashSet<Character> window = new HashSet<>();for (int right = 0; right < n; right++) {char c = s.charAt(right);while (window.contains(c)) { // 判断是否重复window.remove(s.charAt(left));left++;}window.add(c);ans = Math.max(ans, right - left + 1);}return ans;}
}

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

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

相关文章

EasyRecovery2024电脑数据恢复工具好不好用?

Ontrack是我们综述中的第一个产品&#xff0c;由于该软件的功效和广度&#xff0c;我认为它完全基于业务。有一个具有基本功能的免费版本和一系列付费版本&#xff0c;不仅可以恢复文件&#xff08;免费版和家庭版&#xff09;&#xff0c;还可以创建磁盘映像/从 CD 和 DVD 恢复…

微信小程序(九)轮播图

注释很详细&#xff0c;直接上代码 新增内容&#xff1a; 1.轮播容器的基本属性 2.轮播图片的尺寸处理 index.wxml <view class"navs"><text class"active">精选</text><text>手机</text><text>食品</text><…

Java 应用部署包优化经验分享

背景 最近接手了一个 2018 年的老项目&#xff0c;因为太久远了&#xff0c;功能上的代码不敢乱动&#xff0c;虽然是老项目&#xff0c;但最近一年也在持续加功能&#xff0c;功能不稳定&#xff0c;于是我就进入了救火式改 Bug 的状态。 功能不能妄动&#xff0c;但是这个项…

MySQL第一次作业

一、题目要求&#xff1a; 某学校要设计一个数据库,学校的业务规则概括如下&#xff1a; 学校内班级若干,每个班级内又有学生若干。 学校开设课程若干,只有某些特定的班级能上指定的课程。 学生选修某些课程,但是在自身班级下的课程是必修。 学校定期组织考试&#xff0c;成绩…

Ubuntu20.4 Mono C# gtk 编程习练笔记(三)

Mono对gtk做了很努力的封装&#xff0c;即便如此仍然与System.Windows.Form中的控件操作方法有许多差异&#xff0c;这是gtk本身特性或称为特色决定的。下面是gtk常用控件在Mono C#中的一些用法。 Button控件 在工具箱中该控件的clicked信号双击后自动生成回调函数prototype&…

【前后端分离与不分离的区别】

Web 应用的开发主要有两种模式&#xff1a; 前后端不分离 前后端分离 理解它们的区别有助于我们进行对应产品的测试工作。 前后端不分离 在早期&#xff0c;Web 应用开发主要采用前后端不分离的方式&#xff0c;它是以后端直接渲染模板完成响应为主的一种开发模式。以前后端不…

【华为GAUSS数据库】IDEA连接GAUSS数据库方法

背景&#xff1a;数据库为华为gauss for opengauss 集中式数据库 IDEA提供了丰富的各类型数据库驱动&#xff0c;但暂未提供Gauss数据库。可以通过以下方法进行连接。 连接后&#xff0c; 可以自动检查xml文件中的sql语句是否准确&#xff0c;表名和字段名是否正确还可以直接在…

转转交易猫自带客服多模板全开源完整定制版源码

商品发布&#xff1b; 请在后台商品添加成功后&#xff0c; 再点击该商品管理&#xff0c;可重新编辑当前商品的所有信息及配图以及支付等等相关信息 可点击分享或者跳转&#xff0c;将链接地址进行发布分享 请在手机端打开访问 访问商品主要模板文件路径目录 咸鱼&#…

【实操】基于 GitHub Pages + Hexo 搭建个人博客

《开发工具系列》 【实操】基于 GitHub Pages Hexo 搭建个人博客 一、引言二、接入 Node.js2.1 下载并安装 Node.js2.2 环境变量配置 三、接入 Git3.1 下载并安装 Git3.2 环境变量配置 四、接入 Hexo4.1 安装 Hexo4.2 建站4.3 本地启动服务器 五、接入 GitHub Pages5.1 初识 G…

Java--类继承

文章目录 主要内容一.学生类1.源代码代码如下&#xff08;示例&#xff09;: 2.结果 二.交通工具类1.源代码代码如下&#xff08;示例&#xff09;: 2.结果 三.圆类1.源代码代码如下&#xff08;示例&#xff09;: 2.结果 总结 主要内容 学生类交通工具类圆类 一.学生类 具有…

ChatGLM vs ChatGPT

所有的NLP大模型 都是transformer结构 1.Mask attention 的策略不同 2.训练任务目标不同 国内大模型nb公司&#xff1a;百度、清华智谱 一、主流大模型 粉色&#xff1a;Encoder-only。 绿色&#xff1a;Encoder-Decoder&#xff0c;尽头智谱ChatGLM。 蓝色&#xff1a;…

【MongoDB】下载安装、指令操作

目录 1.下载安装 2.指令 2.1.基础操作指令 2.2.增加 2.3.查询 2.4.修改 2.5.删除 前言&#xff1a; 关于MongoDB的核心概念请移步&#xff1a; 【文档数据库】ES和MongoDB的对比-CSDN博客 1.下载安装 本文以安装Windows版本的mongodb为例&#xff0c;Linux版本的其实…

三、arcgispro二次开发创建第一个工程

忙了几天&#xff0c;总算可以创建第一工程了。 步骤一&#xff1a; 步骤二&#xff1a; 工具介绍&#xff1a; 项目创建成功&#xff1a;项目目录在解决方案资源管理器中&#xff0c;整个工具都是动态可调整的&#xff0c;如下图&#xff1a; 想把窗口放哪里就把鼠标移到红…

Linux重定向:深入理解与实践

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;晴る—ヨルシカ 0:20━━━━━━️&#x1f49f;──────── 4:30 &#x1f504; ◀️ ⏸ ▶️ ☰ &…

RHEL - 更新升级软件或系统

《OpenShift / RHEL / DevSecOps 汇总目录》 文章目录 小版本软件更新yum update 和 yum upgrade 的区别升级软件和升级系统检查软件包是否可升级指定升级软件使用的发行版本方法1方法2方法3方法4 查看软件升级类型更新升级指定的 RHSA/RHBA/RHEA更新升级指定的 CVE更新升级指定…

L1-069 胎压监测(Java)

小轿车中有一个系统随时监测四个车轮的胎压&#xff0c;如果四轮胎压不是很平衡&#xff0c;则可能对行车造成严重的影响。 让我们把四个车轮 —— 左前轮、右前轮、右后轮、左后轮 —— 顺次编号为 1、2、3、4。本题就请你编写一个监测程序&#xff0c;随时监测四轮的胎压&…

Java中的包、类、接口说明

写在开头 包、类、接口、方法、变量、参数、代码块,这些都是构成Java程序的核心部分,即便最简单的一段代码里都至少要包含里面的三四个内容,这两天花点时间梳理了一下,理解又深刻了几分。 Java中的包 Java 定义了一种名字空间,称之为包:package。一个类总是属于某个包…

Servlet系列:两种创建方式(xml,注解)

一、使用web.xml的方式配置&#xff08;Servlet2.5之前使用&#xff09; 在早期版本的Java EE中&#xff0c;可以使用XML配置文件来定义Servlet。在web.xml文件中&#xff0c;可以定义Servlet的名称、类名、初始化参数等。然后&#xff0c;在Java代码中实现Servlet接口&#x…

wayland(xdg_wm_base) + egl + opengles 最简实例

文章目录 前言一、ubuntu 下相关环境准备1. 获取 xdg_wm_base 依赖的相关文件2. 查看 ubuntu 上安装的opengles 版本3. 查看 weston 所支持的 窗口shell 接口种类二、xdg_wm_base 介绍三、egl_wayland_demo1.egl_wayland_demo2_0.c2.egl_wayland_demo3_0.c3. xdg-shell-protoco…

Chatopera 云服务支持大语言模型对话(LLM),定制您的聊天机器人

2024 年&#xff0c;Chatopera 云服务继续不断完善&#xff0c;为开发者提供最好的定制聊天机器人的工具。在过去的一年&#xff0c;用户们反映最多的建议是 Chatopera 云服务内置大语言模型的对话&#xff0c;今天 Chatopera 云服务完成了产品升级&#xff0c;满足了这个诉求。…