当前位置: 首页 > news >正文

算法 - 二分法 / 双指针 / 三指针 / 滑动窗口

文章目录

  • 🍺 二分法
    • 🍻 旋转数组
      • 🥂 33. 搜索旋转排序数组 [旋转数组] [目标值] (二分法)
    • 🍻 元素边界
      • 🥂 34. 在排序数组中查找元素的第一个和最后一个位置 [有序数组] > [元素边界] > (二分法)
      • 🥂 81. 搜索旋转排序数组Ⅱ [旋转数组] [有重] [目标值] (二分法)
      • 🥂 153. 寻找旋转排序数组中的最小值 [旋转数组] [最小值] (二分法)
  • 🍺 双指针
    • 🍻 元素合并
      • 🥂 21. 合并两个有序链表 [有序链表] [合并] (双指针) (归并)
    • 🍻 元素交换
      • 🥂 LCR 139. 训练计划 I [数组] [元素交换] (双指针)
    • 🍻 元素相交
      • 🥂 142. 环形链表II [链表] > [环] > (双指针)
      • 🥂 160. 相交链表 [链表] > [相交] > (双指针)
    • 🍻 面积
      • 🥂 11. 盛最多水的容器 [数组] [面积] (双指针)
      • 🥂 42. 接雨水 [数组] [面积] (双指针)
    • 🥂 其他
      • 🥂 31. 下一个排列 [数组] [排列] (双指针) (推导)
  • 🍺 三指针
    • 🍻 链表反转
      • 🥂 25. K 个一组翻转链表 [链表] [分组反转] (三指针)
      • 🥂 92. 反转链表II [链表] [反转] (三指针)
      • 🥂 206. 反转链表 [链表] [反转] (三指针)
    • 🍻 快速排序
      • 🥂 215. 数组中的第K个最大元素 [数组] [第K大元素] (三指针) (快速排序)
      • 🥂 912. 排序数组 [数组] [排序] (三指针) (快速排序)
  • 🍺 滑动窗口
    • 🍻 子串
      • 🥂 3. 无重复字符的最长子串 [字符串] [子串] (滑动窗口)
    • 🍻 区间和
      • 🥂 1423. 可获得的最大点数 [数组] > [区间外最大值] > [区间内最小值] > (定长滑动窗口)

🍺 二分法

🍻 旋转数组

🥂 33. 搜索旋转排序数组 [旋转数组] [目标值] (二分法)

class Solution {
public:int search(vector<int>& nums, int target) {int n = nums.size();int left = 0, right = n - 1;// 二分法while (left <= right) {int mid = left + (right - left) / 2;// 先判断找到目标了没if (nums[mid] == target) return mid;// 再继续左右两边找, nums[mid] < nums[0] 说明 mid 在右边if (nums[mid] <= nums[0]) {// 此时 target 处于右右边if (nums[mid] < target && target <= nums[n - 1]) {left = mid + 1;         // 右右} else {right = mid - 1;        // 右左}} else {if (nums[0] <= target && target < nums[mid]) {right = mid - 1;        // 左左} else {left = mid + 1;         // 左右}}}return -1;}
};

🍻 元素边界

🥂 34. 在排序数组中查找元素的第一个和最后一个位置 [有序数组] > [元素边界] > (二分法)

// [有序数组] > [查找元素边界] > (二分法)
class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {int left = find_l(nums, target);int right = find_r(nums,target);return {left, right};}// 二分法查找左边界 [left, right]int find_l(vector<int>& nums, int target) {int n = nums.size();int left = 0, right = n - 1;while (left <= right) {// [left, mid - 1] [mid] [mid + 1, right]int mid = left + (right - left) / 2;if (nums[mid] >= target) {right = mid - 1;} else {left = mid + 1;}}// left = 3, right = 3 - 1 = 2if (0 <= left && left < n && nums[left] == target) {return left;}return -1;}// 二分法查找右边界 [left, right]int find_r(vector<int>& nums, int target) {int n = nums.size();int left = 0, right = n - 1;while (left <= right) {// [left, mid - 1] [mid] [mid + 1, right]int mid = left + (right - left) / 2;if (nums[mid] > target) {right = mid - 1;} else {left = mid + 1;}}// right = 4, left = 4 + 1 = 5if (0 <= right && right < n && nums[right] == target) {return right;}return -1;}
};

🥂 81. 搜索旋转排序数组Ⅱ [旋转数组] [有重] [目标值] (二分法)

class Solution {
public:bool search(vector<int>& nums, int target) {int n = nums.size();int left = 0, right = n - 1;// 二分法while (left <= right) {// 判断是否存在int mid = left + (right - left) / 2;if (nums[mid] == target) return true;// 去除重复元素if (nums[mid] == nums[left]) {left++;continue;}if (nums[mid] == nums[right]) {right--;continue;}// 防止卡住, 区分不出左右if (nums[mid] < nums[0]) {  // 右// 再判断 target 在右边的左边还是右边 [left, mid-1][mid][mid+1, right]if (nums[mid] < target && target <= nums[n - 1]) {left = mid + 1;     // 右右} else {right = mid - 1;    // 右左}} else {                    // 左// 再判断 target 在左边的左边还是右边 [left, mid-1][mid][mid+1, right]if (nums[0] <= target && target < nums[mid]) {right = mid - 1;    // 左左} else {left = mid + 1;     // 左右}}}return false;}
};

🥂 153. 寻找旋转排序数组中的最小值 [旋转数组] [最小值] (二分法)

class Solution {
public:int findMin(vector<int>& nums) {int left = 0, right = nums.size() - 1;// 二分法 [0, n-1]while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] < nums[right]) {right = mid;} else if (nums[mid] > nums[right]) {left = mid + 1;} else {right--;}}return nums[left];}
};

🍺 双指针

🍻 元素合并

🥂 21. 合并两个有序链表 [有序链表] [合并] (双指针) (归并)

class Solution {
public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {// 虚拟头节点, 当前节点指向虚拟头节点ListNode* dummy = new ListNode(-1), * cur = dummy;// 双指针ListNode* p1 = list1, * p2 = list2;while (p1 != nullptr && p2 != nullptr) {if (p1->val < p2->val) {cur->next = p1;p1 = p1->next;} else {cur->next = p2;p2 = p2->next;}cur = cur->next;}// 剩下的直接拼上if (p1 != nullptr) cur->next = p1;if (p2 != nullptr) cur->next = p2;return dummy->next;}
};

🍻 元素交换

🥂 LCR 139. 训练计划 I [数组] [元素交换] (双指针)

class Solution {
public:vector<int> trainingPlan(vector<int>& actions) {int n = actions.size();if (n <= 1) return actions;// 定义双指针,一个指向头,一个指向尾int left = 0, right = n - 1;             while (left < right) {// 依次移动,找到数时暂停while (left < right && actions[left] % 2 == 1) {left++;}while (left < right && actions[right] % 2 == 0) {right--;}std::swap(actions[left], actions[right]);}return actions;}
};

🍻 元素相交

🥂 142. 环形链表II [链表] > [环] > (双指针)

// [链表] > [环] > (双指针)
class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode* dummy = new ListNode(-1);dummy->next = head;ListNode* fast = dummy, * slow = dummy;// 满指针走一步, 快指针走两步, 判断有无环while (fast->next && fast->next->next) {slow = slow->next;fast = fast->next->next;// 如果相遇, 则让满指针从头开始走, 两者同步移动if (fast == slow) {fast = dummy;while (fast != slow) {slow = slow->next;fast = fast->next;}return fast;}}return nullptr;   }
};

🥂 160. 相交链表 [链表] > [相交] > (双指针)

// [链表] > [相交] > (双指针)
class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {// 双指针ListNode *p1 = headA, *p2 = headB;// A 走到 nullptr 后接着走 B, B 走到 nullptr 后接着走 A// 当 p1 == p2 的地方就是相交的地方while (p1 != p2) {if (p1 == nullptr) p1 = headB;else p1 = p1->next;if (p2 == nullptr) p2 = headA;else p2 = p2->next;}return p1;}
};

🍻 面积

🥂 11. 盛最多水的容器 [数组] [面积] (双指针)

class Solution {
public:int maxArea(vector<int>& height) {// 双指针int left = 0, right = height.size() - 1;// 最大面积, 当前面积int res = 0, cur = 0;// 缩小区域while (left < right) {cur = min(height[left], height[right]) * (right - left);res = max(res, cur);// 哪一边比较短, 移动哪一边if (height[left] < height[right]) {left++;} else {right--;}}return res;}
};

🥂 42. 接雨水 [数组] [面积] (双指针)

class Solution {
public:int trap(vector<int>& height) {// 左边边界, 右边边界, 最边上存不了水int left = 0, right = height.size() - 1;// 左边最大值, 右边最大值int left_max = height[left], right_max = height[right];// 当前装水量, 总装水量int cur = 0, res = 0;while (left <= right) {left_max = max(left_max, height[left]);right_max = max(right_max, height[right]);if (left_max < right_max) {// 左指针的leftMax比右指针的rightMax矮// 说明:左指针的右边至少有一个板子 > 左指针左边所有板子// 那么可以计算左指针当前列的水量:左边最大高度-当前列高度res += left_max - height[left];left++;} else {res += right_max - height[right];right--;}}return res;}
};

🥂 其他

🥂 31. 下一个排列 [数组] [排列] (双指针) (推导)

class Solution {
private:int flag = 0;   // 设置一个标志位, 代表找到当前排列了
public:void nextPermutation(vector<int>& nums) {int n = nums.size();// 从后往前找, 找到第一个 nums[i] < nums[j] 的地方int i = n - 2, j = n - 1;while (i >= 0 && nums[i] >= nums[i + 1]) {i--;}// 此时不是最后一个排列if (i >= 0) {// 找到一个比 nums[i] 大的第一个元素while (j > i && nums[j] <= nums[i]) {j--;}// 交换两者swap(nums[i], nums[j]);// 再将剩余部分逆转, 把降序变为升序reverse(nums.begin() + i + 1, nums.end());} else {// 如果是最后一个排列reverse(nums.begin(), nums.end());}return;}
};

🍺 三指针

🍻 链表反转

🥂 25. K 个一组翻转链表 [链表] [分组反转] (三指针)

class Solution {
public:ListNode* reverseKGroup(ListNode* head, int k) {// 虚拟头节点ListNode* dummy = new ListNode(-1);     dummy->next = head;// 前置节点和后置节点ListNode* pre = dummy, * end = dummy;// 每次翻转 K 个节点while (end->next != nullptr) {for (int i = 0; i < k && end != nullptr; ++i) {end = end->next;}if (end == nullptr) break;// [pre] > [start] > [2] > [end] | [next] [5]ListNode* start = pre->next, * next = end->next;end->next = nullptr;// [pre] > [end] > [2] > [start] | [next] [5]pre->next = reverse(start);// [pre] > [end] > [2] > [start] > [next] [5]start->next = next;pre = start;end = start;}return dummy->next;}// 翻转链表ListNode* reverse(ListNode* head) {// [pre] | [cur] > [next]ListNode* pre = nullptr;ListNode* cur = head;while (cur != nullptr) {ListNode* next = cur->next;// [pre] < [cur] | [next]cur->next = pre;// [N] < [pre] | [cur]pre = cur;cur = next;}// 此时 cur 为空, pre 为最后一个非空节点return pre;} 
};

🥂 92. 反转链表II [链表] [反转] (三指针)

class Solution {
public:ListNode* reverseBetween(ListNode* head, int left, int right) {ListNode* dummy = new ListNode(-1);dummy->next = head;// 四个指针分别指向 pre start end next// [1] > [pre] > [start] > [4] > [5] > [end] > [next]ListNode* pre = dummy, * end = dummy;for (int i = 0; i < left - 1; ++i) pre = pre->next;cout << pre->val;for (int j = 0; j < right; ++j) end = end->next;ListNode* start = pre->next, * next = end->next;// [1] > [pre] > [start] > [4] > [5] > [end] | [next]end->next = nullptr;// [1] > [pre] > [end] > [5] > [4] > [start] | [next]pre->next = reverse(start);// [1] > [pre] > [end] > [5] > [4] > [start] > [next]start->next = next;return dummy->next;}// 翻转链表ListNode* reverse(ListNode* head) {// [pre] | [cur] > [next]ListNode* pre = nullptr;ListNode* cur = head;while (cur != nullptr) {ListNode* next = cur->next;// [pre] < [cur] | [next]cur->next = pre;// [N] < [pre] | [cur]pre = cur;cur = next;}// 此时 cur 为空, pre 为最后一个非空节点return pre;}
};

🥂 206. 反转链表 [链表] [反转] (三指针)

class Solution {
public:ListNode* reverseList(ListNode* head) {return reverse(head);}// 翻转链表ListNode* reverse(ListNode* head) {// [pre] | [cur] > [next]ListNode* pre = nullptr;ListNode* cur = head;while (cur != nullptr) {ListNode* next = cur->next;// [pre] < [cur] | [next]cur->next = pre;// [N] < [pre] | [cur]pre = cur;cur = next;}// 此时 cur 为空, pre 为最后一个非空节点return pre;}
};

🍻 快速排序

🥂 215. 数组中的第K个最大元素 [数组] [第K大元素] (三指针) (快速排序)

class Solution {
private:int target; // 目标索引, 第 n-k 小int res;    // 目标值
public:int findKthLargest(vector<int>& nums, int k) {// 快速排序, 每次可以确定好一个元素的位置, 当索引为 k 时, 代表找到int n = nums.size();// 第 k 大就是第 n - k 小target = n - k;// 开始快排quickSort(nums, 0, n - 1);return res;}// 快排 [left, right]void quickSort(vector<int>& nums, int left, int right) {if (left > right) return;// 只剩一个元素if (left == right && left == target) {res = nums[target];return;}// 先获取一个哨兵, 将数组分为小于它的部分和大于它的部分vector<int> edge = part(nums, left, right);// 如果 target 在左右边界之间, 则找到if (edge[0] <= target && target <= edge[1]) {res = nums[target];return;}// 继续递归quickSort(nums, left, edge[0] - 1);quickSort(nums, edge[1] + 1, right);}// 分隔, 三指针, 这里返回相同元素的左右边界是为了去重vector<int> part(vector<int>& nums, int left, int right) {int pivot_idx = rand() % (right - left + 1) + left;int pivot = nums[pivot_idx];// [pivot]  [1]  [2]  [3]  [4]//  L/LP    CP                  RP swap(nums[pivot_idx], nums[left]);// 设置三个指针, 分别指向小于 pivot 的元素, 当前元素, 大于 pivot 的元素int curp = left + 1, leftp = left, rightp = right + 1;// 还没走到尽头, rightp 始终是指向大于 pivot 元素的while (curp < rightp) {if (nums[curp] < pivot) {           // 小于哨兵leftp++;swap(nums[curp], nums[leftp]);curp++;} else if (nums[curp] > pivot) {    // 大于哨兵rightp--;swap(nums[curp], nums[rightp]);} else {                            // 相等, 什么也不做curp++;}}// 最后 leftp 指向的内容肯定是最后一个小于 pivot 的, 它与 pivot 交换swap(nums[left], nums[leftp]);// 返回等于 pivot 的左边界和右边界 [小于] [pivot] [大于]return {leftp, rightp - 1};}
};

🥂 912. 排序数组 [数组] [排序] (三指针) (快速排序)

class Solution {
public:vector<int> sortArray(vector<int>& nums) {int n = nums.size();quickSort(nums, 0, n - 1);return nums;}// 快排 [left, right]void quickSort(vector<int>& nums, int left, int right) {// 只剩一个元素, 就不用排了if (left > right) return;// 先获取一个哨兵, 将数组分为小于它的部分和大于它的部分vector<int> edge = part(nums, left, right);// 继续递归quickSort(nums, left, edge[0] - 1);quickSort(nums, edge[1] + 1, right);}// 分隔, 三指针, 这里返回相同元素的左右边界是为了去重vector<int> part(vector<int>& nums, int left, int right) {int pivot_idx = rand() % (right - left + 1) + left;int pivot = nums[pivot_idx];// [pivot]  [1]  [2]  [3]  [4]//  L/LP    CP                  RP swap(nums[pivot_idx], nums[left]);// 设置三个指针, 分别指向小于 pivot 的元素, 当前元素, 大于 pivot 的元素int curp = left + 1, leftp = left, rightp = right + 1;// 还没走到尽头, rightp 始终是指向大于 pivot 元素的while (curp < rightp) {if (nums[curp] < pivot) {           // 小于哨兵leftp++;swap(nums[curp], nums[leftp]);curp++;} else if (nums[curp] > pivot) {    // 大于哨兵rightp--;swap(nums[curp], nums[rightp]);} else {                            // 相等, 什么也不做curp++;}}// 最后 leftp 指向的内容肯定是最后一个小于 pivot 的, 它与 pivot 交换swap(nums[left], nums[leftp]);// 返回等于 pivot 的左边界和右边界 [小于] [pivot] [大于]return {leftp, rightp - 1};}
};

🍺 滑动窗口

🍻 子串

🥂 3. 无重复字符的最长子串 [字符串] [子串] (滑动窗口)

class Solution {
private:unordered_map<char, int> umap;      // 滑动窗口int res = 0;                        // 存放结果
public:int lengthOfLongestSubstring(string s) {int n = s.size();int left = 0, right = 0;        // 窗口边界while (right < n) {char cur_r = s[right++];    // 取当前字符串umap[cur_r]++;              // 更新窗口内容// 判断是否该缩小窗口while (umap[cur_r] > 1) {char cur_l = s[left++];umap[cur_l]--;}// 此时已经没有重复元素出现 [left, right)res = max(res, right - left);}return res;}
};

🍻 区间和

🥂 1423. 可获得的最大点数 [数组] > [区间外最大值] > [区间内最小值] > (定长滑动窗口)

// [数组] > [区间外最大值] > [区间内最小值] > (定长滑动窗口)
class Solution {
public:int maxScore(vector<int>& cardPoints, int k) {int n = cardPoints.size();int windowSize = n - k;// [0, n-k] 的区间和int sum = accumulate(cardPoints.begin(), cardPoints.begin() + windowSize, 0);int min_val = sum;          // 窗口的最小值// 移动for (int i = 0; i < n - windowSize; ++i) {int left = i, right = i + windowSize;sum += cardPoints[right] - cardPoints[left];min_val = min(min_val, sum);}return accumulate(cardPoints.begin(), cardPoints.end(), 0) - min_val;}
};

相关文章:

算法 - 二分法 / 双指针 / 三指针 / 滑动窗口

文章目录 &#x1f37a; 二分法&#x1f37b; 旋转数组&#x1f942; 33. 搜索旋转排序数组 [旋转数组] [目标值] (二分法) &#x1f37b; 元素边界&#x1f942; 34. 在排序数组中查找元素的第一个和最后一个位置 [有序数组] > [元素边界] > (二分法)&#x1f942; 81. …...

ChatGPT3.5、GPT4.0、DALL·E 3和Midjourney对话与绘画智能体验

MidTool&#xff08;https://www.aimidtool.com/&#xff09;是一个集成了多种先进人工智能技术的助手&#xff0c;它融合了ChatGPT3.5、GPT4.0、DALLE 3和Midjourney等不同的智能服务&#xff0c;提供了一个多功能的体验。下面是这些技术的简要介绍&#xff1a; ChatGPT3.5&am…...

MySQL中锁的概述

按照锁的粒度来分可分为&#xff1a;全局锁&#xff08;锁住当前数据库的所有数据表&#xff09;&#xff0c;表级锁&#xff08;锁住对应的数据表&#xff09;&#xff0c;行级锁&#xff08;每次锁住对应的行数据&#xff09; 加全局锁&#xff1a;flush tables with read lo…...

5396. 棋盘

5396. 棋盘 - AcWing题库 二维差分数组 #include <iostream> #include <vector> using namespace std;int main() {int n, m;cin >> n >> m;vector<vector<int>> v(n 2, vector<int>(n 2));while (m--) {int x1, x2, y1, y2;cin…...

阿里云地域和可用区分布表,2024更新

2024年阿里云服务器地域分布表&#xff0c;地域指数据中心所在的地理区域&#xff0c;通常按照数据中心所在的城市划分&#xff0c;例如华北2&#xff08;北京&#xff09;地域表示数据中心所在的城市是北京。阿里云地域分为四部分即中国、亚太其他国家、欧洲与美洲和中东&…...

Pandas实战100例 | 案例 49: 数值运算

案例 49: 数值运算 知识点讲解 Pandas 提供了进行基本数学运算的简便方法,允许你在 DataFrame 的列之间执行加法、减法、乘法和除法等操作。 数值运算: 直接对 DataFrame 的列应用算术运算符(+, -, *, /)可以执行相应的数值运算。示例代码 # 准备数据和示例代码的运行结果…...

OSI七层协议和五层协议

【 1 】互联网协议交互的基础 硬件设备 光缆 【 2 】OSI七层协议 物理层&#xff08;Physical Layer&#xff09;&#xff1a;负责传输比特流&#xff08;0和1&#xff09;以及物理连接的建立和维护。数据链路层&#xff08;Data Link Layer&#xff09;&#xff1a;提供可…...

深度学习记录--归—化输入特征

归化 归化输入(normalizing inputs),对特征值进行一定的处理&#xff0c;可以加速神经网络训练速度 步骤 零均值化 通过x值更新让均值稳定在零附近&#xff0c;即为零均值化 归化方差 适当减小变量方差 解释 归化可以让原本狭长的数据图像变得规整&#xff0c;梯度下降的…...

Go Build编译打包文件

Go编译打包文件 1、简单打包 程序 main1.go&#xff1a; package mainimport "fmt"func main() {fmt.Println("Hello World!") }打包&#xff1a; # 在linux服务上执行下面的3个命令 # linux平台,生成main1可执行程序 CGO_ENABLED0 GOOSlinux GOARCHam…...

Java网络编程:概述--快速入门

I. 介绍 1.1 什么是网络编程 - 网络编程是指通过计算机网络实现程序之间的通信。在Java中&#xff0c;网络编程通常涉及到数据的传输、通信协议的使用以及与网络相关的各种操作。 1.2. 为什么学习Java网络编程 - Java网络编程是Java开发者重要的技能之一&#xff0c;因为它允许…...

linux配置DNS主从服务器

实验设备 主服务器:OpenElur Linux IP地址为192.168.188.129 从服务器:RedHat Linux IP地址为192.168.188.128 实验步骤 1.进行主服务器的基础配置 #安装DNS对应工具 [rootOpenElurRJW ~]# yum install bind -y#编辑DNS系统配置信息 [rootOpenElurRJW ~]# cat /etc/named.…...

Day34 贪心算法 part03 1005. K 次取反后最大化的数组和 134. 加油站 135. 分发糖果

贪心算法 part03 1005. K 次取反后最大化的数组和 134. 加油站 135. 分发糖果 1005. K 次取反后最大化的数组和 思路 第一步&#xff0c;从前向后遍历&#xff0c;遇到负数将其变为正数&#xff0c;同时K–第二步&#xff1a;如果K还大于0&#xff0c;那么反复转变数值最小的…...

最全对象存储(云盘)挂载本地主机或服务器

1.对象存储介绍 1.1 分类 分布式存储的应用场景相对于其存储接口&#xff0c;现在流行分为三种: 块存储: 这种接口通常以QEMU Driver或者Kernel Module的方式存在&#xff0c;这种接口需要实现Linux的Block Device的接口或者QEMU提供的Block Driver接口&#xff0c;块存储一般…...

24校招,江淮汽车软件测试工程师技术面+HR面

前言 记录一下楼主的面试经历&#xff0c;希望对后来者有用 时间&#xff1a;15min 平台&#xff1a;腾讯会议 过程 技术面试 自我介绍 为啥不考研 实习收获 你有做过软件开发的工作吗&#xff1f; 除了Java和Python&#xff0c;还会其他的语言吗&#xff1f; 学过C吗…...

从零开始学习Zeppelin:大数据可视化分析的交互式开发系统!

介绍&#xff1a;Apache Zeppelin是一个基于Web的交互式开发系统&#xff0c;主要用于进行大数据可视化分析。其核心概念是notebook&#xff0c;所有的操作都可以在notebook中完成。Zeppelin提供了一套非常全面的数据分析解决方案&#xff0c;支持数据采集、数据发现、数据分析…...

VCG 曲面重建之滚球算法

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 滚球算法(BPA)是一种与alpha形状相关的曲面重建方法。直观地想象一个具有给定半径的3D球,我们把它扔在点云上。如果它击中任何3个点(并且它没有穿过这3个点),它就创造了一个三角形。然后,算法从现有三角形的边缘…...

为什么使用双token实现无感刷新用户认证?

单token机制 认证机制&#xff1a;对与单token的认证机制在我们项目中仅使用一个Access Token的访问令牌进行用户身份认证和授权的方案处理。 不足之处&#xff1a; 安全性较低(因为只有一个token在客户端和服务器端之间进行传递&#xff0c;一目Acess Token被截获或者被泄露…...

论文阅读 Self-Supervised Burst Super-Resolution

这是一篇 ICCV 2023 的文章&#xff0c;主要介绍的是用自监督的方式进行多帧超分的学习 Abstract 这篇文章介绍了一种基于自监督的学习方式来进行多帧超分的任务&#xff0c;这种方法只需要原始的带噪的低分辨率的图。它不需要利用模拟退化的方法来构造数据&#xff0c;而且模…...

Spring+SpringMVC+Mybatis进行项目的整合

Spring SpringMVCM Mybatis 整合 一、 通过idea创建maven工程 二、 引入依赖项以及导入mybatis逆向工程的插件 将如下的文件替换所在工程的pom文件 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4…...

vue3 实现简单计数器示例——一个html文件展示vue3的效果

目的&#xff1a;作为一个新手开发&#xff0c;我想使用 Vue 3 将代码封装在 HTML 文件中时&#xff0c;进行界面打开展示。 一、vue计数示例 学了一个简单计数器界面展示&#xff0c;代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head&…...

面试经典150题(88-89)

leetcode 150道题 计划花两个月时候刷完&#xff0c;今天&#xff08;第四十四天&#xff09;完成了2道(88-89)150&#xff1a; 88.(22. 括号生成) 题目描述&#xff1a; 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效…...

【设计模式-3.3】结构型——享元模式

说明&#xff1a;说明&#xff1a;本文介绍设计模式中结构型设计模式中的&#xff0c;享元模式&#xff1b; 游戏地图 在一些闯关类的游戏&#xff0c;如超级玛丽、坦克大战里面&#xff0c;游戏的背景每一个关卡都不相同&#xff0c;但仔细观察可以发现&#xff0c;其都是用…...

【征服redis6】Redis的内存淘汰详解

目录 1.redis的基本策略 2.Redis中的缓存淘汰策略 3.Redis内存不足的情况 4.几种淘汰策略的实现原理 5.项目实践与优化策略 5.1 配置案例 5.2 项目优化策略参考 数据库存储会将数据保存到磁盘中&#xff0c;而Redis的核心数据是在内存中的&#xff0c;而Redis本身主要用来…...

多文件转二维码的两种方式,有兴趣的了解一下

多个文件能一键生成二维码吗&#xff1f;二维码是现在很多人用来展示文件内容的一种手段&#xff0c;在制作二维码图片之后&#xff0c;其他人扫码就可以查看文件或者下载文件&#xff0c;有效的提升文件获取的效率。一般情况下&#xff0c;文件二维码分为多个文件生成一个二维…...

uniapp APP接入Paypal

1. 登录paypal开发者中心&#xff0c; 2. 选择 Apps & Credentials 点击 Create App创建应用&#xff0c;创建后点击编辑按钮&#xff0c;如图&#xff1a; 3. 进入应用详情&#xff0c;勾选Log in with PayPal点击 Advanced Settings 添加return URL等信息并保存。如图&a…...

QT-贪吃小游戏

QT-贪吃小游戏 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include "Snake.h" #include "Food.h" #include "Stone.h" #include "Mushroom.h" #include "Ai.h" #include "Game.h" #inclu…...

HubSpot:如何设计和执行客户旅程?

在当今数字化时代&#xff0c;企业成功的关键之一是建立并优化客户旅程。HubSpot作为一体化市场营销平台&#xff0c;通过巧妙设计和执行客户旅程&#xff0c;实现了个性化决策&#xff0c;关键节点的精准引导&#xff0c;为企业带来了数字化转型的引领力。 一、HubSpot是如何设…...

【Go学习】macOS+IDEA运行golang项目,报command-line-arguments,undefined

写在前面的话&#xff1a;idea如何配置golang&#xff0c;自行百度 问题1&#xff1a;通过idea的terminal执行go test报错 ✘ xxxxxmacdeMacBook-Pro-3  /Volumes/mac/.../LearnGoWithTests/hello  go test go: go.mod file not found in current directory or any parent …...

优先看我的博客:工控机 Ubuntu系统 输入密码登录界面后界面模糊卡死,键盘鼠标失效(不同于其他博主的问题解决方案,优先看我的博客。)

工控机Ubuntu 输入密码登录界面后界面模糊卡死&#xff0c;键盘鼠标失效 &#xff08;不同于其他博主的问题解决方案&#xff0c;工控机Ubuntu的系统 优先看我的博客。&#xff09; 系统版本&#xff1a;ubuntu18.04 主机&#xff1a;工控机 应用场景&#xff1a;电力系统巡…...

SAP 中的外部接口:预扣税

文章目录 1 Introduction2 implementation3 Summary 1 Introduction We use BP create WTAX_TYPE ,I don’t find a bapi. We will update for it . We will impement WTax type , WTax code ,Subject in the ‘BP’. 2 implementation UPDATE lfbw SET witht gs_alv-wit…...