一、基础算法精讲:双指针

目录

  • 1、相向双指针 1
    • 1.1 两数之和 II - 输入有序数组
    • 1.2 三数之和
    • 1.3 最接近的三数之和
    • 1.4 四数之和
    • 1.5 统计和小于目标的下标对数目
    • 1.6 有效三角形的个数
  • 2、相向双指针 2
    • 2.1 盛最多水的容器
    • 2.2 接雨水
  • 3、同向双指针:滑动窗口(区间大小可变)
    • 3.1 长度最小的子数组
    • 3.2 乘积小于 K 的子数组
    • 3.3 无重复字符的最长字串
    • 3.4 最大连续1的个数 III
    • 3.5 替换子串得到平衡字符串
    • 3.6 将 x 减到 0 的最小操作数

1、相向双指针 1

1.1 两数之和 II - 输入有序数组

Leetcode 167

注意,这里可以使用相向双指针的原因是因为这里的数组是非递减的。

class Solution:def twoSum(self, numbers: List[int], target: int) -> List[int]:l = 0r = len(numbers) - 1while True:s = numbers[l] + numbers[r]if s == target:return [l + 1, r + 1]if s > target:r -= 1else:l += 1
class Solution {
public:vector<int> twoSum(vector<int>& numbers, int target) {int l = 0, r = numbers.size() - 1;while (true) {int s = numbers[l] + numbers[r];if (s == target) return {l + 1, r + 1};s > target ? r -- : l ++ ;}}
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

1.2 三数之和

Leetcode 15

class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:nums.sort()ans = []n = len(nums)for i in range(n - 2):x = nums[i]if i > 0 and x == nums[i - 1]:  # 跳过重复数字continueif x + nums[i + 1] + nums[i + 2] > 0:  # 优化一breakif x + nums[-2] + nums[-1] < 0:  # 优化二continuej = i + 1k = n - 1while j < k:s = x + nums[j] + nums[k]if s > 0:k -= 1elif s < 0:j += 1else:ans.append([x, nums[j], nums[k]])j += 1while j < k and nums[j] == nums[j - 1]:  # 跳过重复数字j += 1k -= 1while k > j and nums[k] == nums[k + 1]:  # 跳过重复数字k -= 1return ans
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(), nums.end());vector<vector<int>> ans;int n = nums.size();for (int i = 0; i < n - 2; i ++ ) {int x = nums[i];if (i && x == nums[i - 1]) continue;  // 跳过重复数字if (x + nums[i + 1] + nums[i + 2] > 0) break;  // 优化一if (x + nums[n - 1] + nums[n - 2] < 0) continue;  // 优化二int j = i + 1, k = n - 1;while (j < k) {int s = x + nums[j] + nums[k];if (s > 0) k -- ;else if (s < 0) j ++ ;else {ans.push_back({x, nums[j], nums[k]});for ( ++ j; j < k && nums[j] == nums[j - 1]; j ++ );  // 跳过重复元素for ( -- k; k > j && nums[k] == nums[k + 1]; k -- );  // 跳过重复元素}}}return ans;}
}; 
  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度: O ( 1 ) O(1) O(1)

1.3 最接近的三数之和

Leetcode 16

注意这里的三个优化:

class Solution:def threeSumClosest(self, nums: List[int], target: int) -> int:nums.sort()n = len(nums)minDiff = infans = 0for i in range(n - 2):x = nums[i]# 优化三if i and x == nums[i - 1]: continue# 优化一s = x + nums[i + 1] + nums[i + 2]if s > target:if s - target < minDiff:minDiff = s - targetans = sbreak# 优化二s = x + nums[-1] + nums[-2]if s < target:if target - s < minDiff:minDiff = target - sans = scontinuej, k = i + 1, n - 1while j < k:s = x + nums[j] + nums[k]if s == target:return sif s > target:      if s - target < minDiff:minDiff = s - targetans = s      k -= 1 else:if target - s < minDiff:minDiff = target - sans = sj += 1return ans
class Solution {
public:int threeSumClosest(vector<int>& nums, int target) {int res;int min_diff = 1e9;int n = nums.size();sort(nums.begin(), nums.end());for (int i = 0; i < n - 2; i ++ ) {int x = nums[i];// 优化一if (i && x == nums[i - 1]) continue;// 优化二int s = x + nums[i + 1] + nums[i + 2];if (s > target) {if (s - target < min_diff) min_diff = s - target, res = s;break;}// 优化三s = x + nums[n - 2] + nums[n - 1];if (s < target) {if (target - s < min_diff)min_diff = target - s, res = s;continue;}int j = i + 1, k = n - 1;while (j < k) {s = x + nums[j] + nums[k];if (s == target) return s;if (s > target) {if (s - target < min_diff)min_diff = s - target, res = s;k -- ;} else {if (target - s < min_diff)min_diff = target - s, res = s;j ++ ;}}}return res;}
};
  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度: O ( 1 ) O(1) O(1)

1.4 四数之和

Leetcode 18

class Solution:def fourSum(self, nums: List[int], target: int) -> List[List[int]]:nums.sort()n = len(nums)ans = []for a in range(n - 3):x = nums[a]if a and x == nums[a - 1]: continueif x + nums[a + 1] + nums[a + 2] + nums[a + 3] > target: breakif x + nums[-1] + nums[-2] + nums[-3] < target: continue;for b in range(a + 1, n - 2):y = nums[b]if b > a + 1 and y == nums[b - 1]: continueif x + y + nums[b + 1] + nums[b + 2] > target: breakif x + y + nums[-1] + nums[-2] < target: continuec, d = b + 1, n - 1while c < d:s = x + y + nums[c] + nums[d]if s > target: d -= 1elif s < target: c += 1else: ans.append([x, y, nums[c], nums[d]])c += 1while c < d and nums[c] == nums[c - 1]: c += 1d -= 1while c < d and nums[d] == nums[d + 1]: d -= 1return ans
class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> ans;int n = nums.size();sort(nums.begin(), nums.end());for (int a = 0; a < n - 3; a ++ ) {long long x = nums[a];if (a && x == nums[a - 1]) continue;if (x + nums[a + 1] + nums[a + 2] + nums[a + 3] > target) break;if (x + nums[n - 1] + nums[n - 2] + nums[n - 3] < target) continue;for (int b = a + 1; b < n - 2; b ++ ) {long long y = nums[b];if (b > a + 1 && y == nums[b - 1]) continue;if (x + y + nums[b + 1] + nums[b + 2] > target) break;if (x + y + nums[n - 1] + nums[n - 2] < target) continue;int c = b + 1, d = n - 1;while (c < d) {long long s = x + y + nums[c] + nums[d];if (s < target) c += 1;else if (s > target) d -= 1;else {ans.push_back({(int)x, (int)y, nums[c], nums[d]});for (c ++ ; c < d && nums[c] == nums[c - 1]; c ++ );for (d -- ; c < d && nums[d] == nums[d + 1]; d -- );}}  }}return ans;}
};
  • 时间复杂度: O ( n 3 ) O(n^3) O(n3)
  • 空间复杂度: O ( 1 ) O(1) O(1)

1.5 统计和小于目标的下标对数目

Leetcode 2824

class Solution:def countPairs(self, nums: List[int], target: int) -> int:nums.sort()n = len(nums)l, r = 0, n - 1ans = 0while l < r:if nums[l] + nums[r] < target:ans += r - ll += 1else:r -= 1return ans
class Solution {
public:int countPairs(vector<int>& nums, int target) {int n = nums.size();sort(nums.begin(), nums.end());int l = 0, r = n - 1, ans = 0;while (l < r) if (nums[l] + nums[r] < target)ans += r - l, l += 1;else r -= 1;return ans;}
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

1.6 有效三角形的个数

Leetcode 611

class Solution:def triangleNumber(self, nums: List[int]) -> int:nums.sort()n = len(nums)ans = 0for k in range(2, n):c = nums[k]l, r = 0, k - 1while l < r:if nums[l] + nums[r] > c:ans += r - lr -= 1else:l += 1return ans
class Solution {
public:int triangleNumber(vector<int>& nums) {sort(nums.begin(), nums.end());int n = nums.size();int ans = 0;for (int k = 2; k < n; k ++ ) {int c = nums[k];int l = 0, r = k - 1;while (l < r) if (nums[l] + nums[r] > c)ans += r - l, r -= 1;else l += 1;}return ans;}
};
  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度: O ( 1 ) O(1) O(1)

2、相向双指针 2

2.1 盛最多水的容器

Leetcode 11

class Solution:def maxArea(self, height: List[int]) -> int:ans = l = 0r = len(height) - 1while l < r:area = (r - l) * min(height[l], height[r])ans = max(ans, area)if height[l] < height[r]:l += 1else:r -= 1return ans
class Solution {
public:int maxArea(vector<int>& height) {int ans = 0, l = 0, r = height.size() - 1;while (l < r) {int area = (r - l) * min(height[l], height[r]);ans = max(area, ans);if (height[l] < height[r]) l += 1;else r -= 1;}return ans;}
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

2.2 接雨水

Leetcode 42

解法一:前后缀分解

class Solution:def trap(self, height: List[int]) -> int:n = len(height)pre_max = [0] * npre_max[0] = height[0]for i in range(1, n):pre_max[i] = max(height[i], pre_max[i - 1])suf_max = [0] * nsuf_max[-1] = height[-1]for i in range(n - 2, -1, -1):suf_max[i] = max(height[i], suf_max[i + 1])ans = 0for h, pre, suf in zip(height, pre_max, suf_max):ans += min(pre, suf) - hreturn ans
class Solution {
public:int trap(vector<int>& height) {int n = height.size();vector<int> pre_max(n);pre_max[0] = height[0];for (int i = 1; i < n; i ++ )pre_max[i] = max(height[i], pre_max[i - 1]);vector<int> suf_max(n);suf_max[n - 1] = height[n - 1];for (int i = n - 2; i >= 0; i -- )suf_max[i] = max(height[i], suf_max[i + 1]);int ans = 0;for (int i = 0; i < n; i ++ ) ans += min(pre_max[i], suf_max[i]) - height[i];return ans;}
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

解法二:双指针

class Solution:def trap(self, height: List[int]) -> int:ans = l = pre_max = suf_max = 0r = len(height) - 1while l < r:pre_max = max(pre_max, height[l])suf_max = max(suf_max, height[r])if pre_max < suf_max:ans += pre_max - height[l]l += 1else:ans += suf_max - height[r]r -= 1return ans
class Solution {
public:int trap(vector<int>& height) {int l = 0, ans = 0, pre_max = 0, suf_max = 0, r = height.size() - 1;while (l < r) {pre_max = max(pre_max, height[l]);suf_max = max(suf_max, height[r]);if (pre_max < suf_max)ans += pre_max - height[l], l += 1;else ans += suf_max - height[r], r -= 1;}return ans;}
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

解法三:单调栈

注意:一个凹槽由三个位置决定【最左边( h e i g h t [ l e f t ] height[left] height[left]),中间( b o t t o m h bottom_h bottomh),最右边( h h h)】

class Solution:def trap(self, height: List[int]) -> int:ans = 0st = []for i, h in enumerate(height):while st and h >= height[st[-1]]:  # 表示可以形成一个凹槽bottom_h = height[st.pop()]    # 弹出栈顶元素并赋值给bottom_hif not st:                     # 没有左边界breakleft = st[-1]dh = min(height[left], h) - bottom_h  # 高度差ans += dh * (i - left - 1)st.append(i)return ans
class Solution {
public:int trap(vector<int>& height) {int ans = 0;stack<int> st;for (int i = 0; i < height.size(); i ++ ) {while (!st.empty() && height[i] >= height[st.top()]) {int bottom_h = height[st.top()];st.pop();if (st.empty()) break;int left = st.top();int dh = min(height[left], height[i]) - bottom_h;ans += dh * (i - left - 1);}st.push(i);}return ans;}
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( m i n ( U , n ) ) O(min(U, n)) O(min(U,n)),其中 U = m a x ⁡ ( h e i g h t ) − m i n ⁡ ( h e i g h t ) + 1 U=max⁡(height)−min⁡(height)+1 U=max(height)min(height)+1

3、同向双指针:滑动窗口(区间大小可变)

3.1 长度最小的子数组

Leetcode 209

这里能够使用双指针是因为 w h i l e while while 条件中是满足单调性的

class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:n = len(nums)ans = infs = left = 0for right, x in enumerate(nums):s += xwhile s >= target:ans = min(ans, right - left + 1)s -= nums[left]left += 1return ans if ans <= n else 0
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int n = nums.size(), ans = n + 1, s = 0, left = 0;for (int right = 0; right < n; right ++ ) {s += nums[right];while (s >= target) {ans = min(ans, right - left + 1);s -= nums[left ++ ];}}return ans <= n ? ans : 0;}
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

3.2 乘积小于 K 的子数组

Leetocde 713

class Solution:def numSubarrayProductLessThanK(self, nums: List[int], k: int) -> int:if k <= 1: return 0ans = l = 0prod = 1for r, x in enumerate(nums):prod *= xwhile prod >= k:prod /= nums[l]l += 1ans += r - l + 1return ans
class Solution {
public:int numSubarrayProductLessThanK(vector<int>& nums, int k) {if (k <= 1) return 0;int n = nums.size(), ans = 0, prod = 1, left = 0;for (int right = 0; right < n; right ++ ) {prod *= nums[right];while (prod >= k) prod /= nums[left ++ ];ans += right - left + 1;}return ans;}
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

3.3 无重复字符的最长字串

Leetcode 3

class Solution:def lengthOfLongestSubstring(self, s: str) -> int:ans = l = 0w = set()for r, c in enumerate(s):while c in w:w.remove(s[l])l += 1w.add(c)ans = max(ans, r - l + 1)return ans

python 另一个版本,效率比上面一个略微差一点:

class Solution:def lengthOfLongestSubstring(self, s: str) -> int:ans = 0cnt = Counter()left = 0for right, c in enumerate(s):cnt[c] += 1while cnt[c] > 1:cnt[s[left]] -= 1left += 1ans = max(ans, right - left + 1)return ans
class Solution {
public:int lengthOfLongestSubstring(string s) {int n = s.size(), ans = 0, l = 0;unordered_set<char> w;for (int r = 0; r < n; r ++ ) {char c = s[r];while (w.count(c)) w.erase(s[l ++ ]);w.insert(c);ans = max(ans, r - l + 1);}return ans;}
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 128 ) ≈ O ( 1 ) O(128) \approx O(1) O(128)O(1)

3.4 最大连续1的个数 III

Leetcode 1004

class Solution:def longestOnes(self, nums: List[int], k: int) -> int:ans = left = cnt0 = 0  # cnt0 用于统计窗口内部0的个数for right, x in enumerate(nums):cnt0 += 1 - xwhile cnt0 > k:cnt0 -= 1 - nums[left]left += 1ans = max(ans, right - left + 1)return ans
class Solution {
public:int longestOnes(vector<int>& nums, int k) {int n = nums.size(), l = 0, ans = 0, cnt0 = 0;for (int r = 0; r < n; r ++ ) {cnt0 += 1 - nums[r];while (cnt0 > k) cnt0 -= 1 - nums[l ++ ];ans = max(ans, r - l + 1);}return ans;}
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

3.5 替换子串得到平衡字符串

Leetcode 1234

如果在 待替换子串(即滑动窗口) 之外的任意字符的出现次数超过 m = n 4 m=\frac{n}{4} m=4n,那么无论怎么替换,都无法使这个字符的出现次数等于 m m m

反过来说,如果在待替换子串之外的任意字符的出现次数都不超过 m m m,那么可以通过替换,使 s s s 为平衡字符串,即每个字符的出现次数均为 m m m

class Solution:def balancedString(self, s: str) -> int:cnt, m = Counter(s), len(s) // 4# 用于判断可迭代对象中的所有元素是否都为真if all(cnt[x] == m for x in "QWER"): return 0ans, left = inf, 0for right, c in enumerate(s):cnt[c] -= 1while all(cnt[x] <= m for x in "QWER"):ans = min(ans, right - left + 1)cnt[s[left]] += 1left += 1return ans
class Solution {
public:int balancedString(string s) {int n = s.length(), m = n / 4, cnt['X']{};for (char c: s) cnt[c] ++ ;if (cnt['Q'] == m && cnt['W'] == m && cnt['E'] == m && cnt['R'] == m)return 0;int ans = n, l = 0;for (int r = 0; r < n; r ++ ) {cnt[s[r]] -- ;while (cnt['Q'] <= m && cnt['W'] <= m && cnt['E'] <= m && cnt['R'] <= m) {ans = min(ans, r - l + 1);cnt[s[l ++ ]] ++ ;}}return ans;}
};
  • 时间复杂度: O ( C N ) O(CN) O(CN),其中 C = 4 C=4 C=4 N N N 为字符串 s s s 的长度
  • 空间复杂度: O ( C ) O(C) O(C)

3.6 将 x 减到 0 的最小操作数

Leetcode 1658

逆向思维

将原问题转换为求解数组中最长的子数组,使得子数组的元素和为 s − x s - x sx,其中 s s s 表示整个数组的和。

class Solution:def minOperations(self, nums: List[int], x: int) -> int:target = sum(nums) - xif target < 0: return -1ans = -1  # 存储长度left = s = 0  # s 存储窗口内的和for right, x in enumerate(nums):s += xwhile s > target:s -= nums[left]left += 1if s == target:ans = max(ans, right - left + 1)return -1 if ans < 0 else len(nums) - ans
class Solution {
public:int minOperations(vector<int>& nums, int x) {int target = accumulate(nums.begin(), nums.end(), 0) - x;if (target < 0) return -1;int ans = -1, l = 0, sum = 0, n = nums.size();for (int r = 0; r < n; r ++ ) {sum += nums[r];while (sum > target) sum -= nums[l ++ ];if (sum == target) ans = max(ans, r - l + 1);}        return ans < 0 ? -1 : n - ans;}
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

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

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

相关文章

docker docker-compose安装(centos7)

docker安装 1.卸载旧版 卸载旧版 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine2.安装一个yum工具 yum install -y yum-utils3.配置docker的yum源 yum-config-manager -…

vulnhub_DeRPnStiNK靶机渗透测试

VulnHub2018_DeRPnStiNK靶机 https://www.vulnhub.com/entry/derpnstink-1,221/ flag1(52E37291AEDF6A46D7D0BB8A6312F4F9F1AA4975C248C3F0E008CBA09D6E9166) flag2(a7d355b26bda6bf1196ccffead0b2cf2b81f0a9de5b4876b44407f1dc07e51e6) flag4(49dca65f362fee401292ed7ada96f9…

ResNet简单解释

什么是Resnet&#xff1f; resnet是一种残差网络&#xff0c;简单看一下resnet的结构 上面是ResNet&#xff0c;下面是传统的 ResNet里的一小块就是这样的 为什么要引入ResNet&#xff1f; 理论上讲&#xff0c;随着网络加深&#xff0c;我们获取的信息越来越多多&#xff0…

WordPress主题模板 大前端D8 5.1版本完整开源版源码简洁大气多功能配置

源码测评&#xff1a;该模板官方已更新至5.2&#xff0c;但是这个5.1也是非常好用的&#xff0c;经测试所有页面均完好&#xff0c;推荐下载使用。 模板简介&#xff1a; 大前端D8 主题是一款非常牛逼的WordPress博客主题,响应式,功能齐全,支持手机,电脑,平板,非常适合做博客站…

​iOS安全加固方法及实现

目录 iOS安全加固方法及实现 摘要 引言 iOS安全加固方法及实现 一、字符串加密 二、类名方法名混淆 三、程序代码混淆 四、加入安全SDK 总结 参考资料 摘要 本文介绍了iOS平台下的应用安全保护方法&#xff0c;包括字符串加密、类名方法名混淆、程序代码混淆和加入安全…

User CSS 在性能优化方面的实践

目录 前言 1. 减少重绘和回流 1.1 用法 1.2 代码示例 1.3 理解 2. 使用CSS精灵 2.1 用法 2.2 代码示例 2.3 理解 3. 压缩CSS文件 3.1 用法 3.2 代码示例 3.3 理解 4. 使用媒体查询进行响应式设计 4.1 用法 4.2 代码示例 4.3 理解 5. 使用CSS预处理器和构建工…

2015年亚太杯APMCM数学建模大赛A题海上丝绸之路发展战略的影响求解全过程文档及程序

2015年亚太杯APMCM数学建模大赛 A题 海上丝绸之路发展战略的影响 原题再现 一带一路不是实体或机制&#xff0c;而是合作与发展的理念和主张。凭借现有有效的区域合作平台&#xff0c;依托中国与有关国家现有的双边和多边机制&#xff0c;利用古丝绸之路的历史象征&#xff0…

深度学习标注工具(包括自动标注)总结——持续更新

首次记录日期2023年10月24日 名称 导出格式支持形状地址1 anylabeling 支持yolov5和v8&#xff0c;自动标注的软件 沿物体轮廓分割 https://github.com/vietanhdev/anylabeling 2 RectLabel 使用Core ML模型自动标记图像 对象、属性、热键和快速标签的设置。 以PASCAL VOC …

【跟小嘉学 Rust 编程】三十三、Rust的Web开发框架之一: Actix-Web的基础

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…

定义USB接口,鼠标类和键盘类都可以作为实现类去实现USB接口

目录 程序设计 程序分析 系列文章 ​ 如图所示,我们电脑上都有USB接口,当我们的鼠标和键盘插上去之后才可以使用,拔出来就关闭使用。其实具体是什么USB设备,笔记本并不关心,只要符合USB规格的设备都可以。鼠标和键盘要想能在电脑上使用,那么鼠标和键盘也必须遵守USB规范…

专家级数据恢复:UFS Explorer Professional Recovery Crack

UFS Explorer Professional Recovery - 一款功能强大且方便的数据恢复程序&#xff0c;支持检测大量文件系统、操作系统和各种类型的驱动器&#xff1a;从简单的闪存驱动器到复杂的复合存储&#xff08;各种级别的 RAID 阵列&#xff09;。 该程序由执业专家开发&#xff0c;并…

可以用商城源码做什么?

商城源码是一个基于电子商务流程的现代化的商城网站程序。它提供了一个完整的电子商务解决方案&#xff0c;包括产品目录、购物车、结账、订单和付款等功能。商城源码可以用于创建各种类型的电子商务网站&#xff0c; 在这篇文章中&#xff0c;我将介绍商城源码可能带来的各种…

【VUE】ArcoDesign之自定义主题样式和命名空间

前言 Arco Design是什么&#xff1f; Arco Design 是由字节跳动推出的企业级产品的完整设计和开发解决方案前端组件库 官网地址&#xff1a;https://arco.design/同时也提供了一套开箱即用的中后台前端解决方案&#xff1a;Arco Design Pro(https://pro.arco.design/) Arco De…

怎么从休学证明中取出休学原因(python自动化办公,涉及word和excel)

怎么从休学证明中取出休学原因&#xff08;python自动化办公&#xff0c;涉及word和excel&#xff09; 本代码偏向处理高校教务处的工作 休学或请假模板如下&#xff1a; 休学证明&#xff08;此联存教务办&#xff09;编号&#xff1a;休202323 计算机系23级计算机科学与技术…

TSINGSEE青犀睡岗离岗检测算法——确保加油站安全运营

众所周知&#xff0c;加油站是一个需要24小时营业的场所&#xff0c;由于夜间加油人员较少&#xff0c;员工极易处于疲劳或者睡眠状态&#xff0c;为保障安全和效率&#xff0c;通过TSINGSEE青犀睡岗离岗检测算法在加油站场景中&#xff0c;可以及时发现工作人员的疲劳状况&…

搜索与图论:匈牙利算法

将所有点分成两个集合&#xff0c;使得所有边只出现在集合之间&#xff0c;就是二分图 二分图&#xff1a;一定不含有奇数个点数的环&#xff1b;可能包含长度为偶数的环&#xff0c; 不一定是连通图 二分图的最大匹配&#xff1a; #include<iostream> #include<cs…

简化对象和函数写法

简化对象写法&#xff1a; 传统写法&#xff1a; var x 10, y 20; var obj {x: x, y: y};简化写法&#xff1a; var x 10, y 20; var obj {x, y};简化函数写法&#xff1a; 传统写法&#xff1a; function add(x, y) {return x y; }简化写法&#xff1a; var add …

YOLOv5— Fruit Detection

&#x1f368; 本文为[&#x1f517;365天深度学习训练营学习记录博客 &#x1f366; 参考文章&#xff1a;365天深度学习训练营-第7周&#xff1a;咖啡豆识别&#xff08;训练营内部成员可读&#xff09; &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制](https…

业务架构、应用架构、技术架构、数据架构

架构规划的重要性 如果没有进行合理的架构规划&#xff0c;将会引发一系列的问题。为了避免这些问题的发生&#xff0c;企业需要进行业务架构、应用架构、技术架构和数据架构的全面规划和设计&#xff0c;以构建一个清晰、可持续发展的企业架构。 https://www.zhihu.com/que…

代码随想录训练营day3:链表part1

理论 链表的增删操作时间复杂度O(1),查询时间复杂度O(n),因为要从头结点开始。使用场景和数据完全相反 链表的储存地址是不连续的。也和数组不同。 移除链表元素 利用虚拟头结点可以同意操作。不然删除头结点需要额外写。 记得返回的是虚拟头结点的next而不是虚拟头结点retu…