【LeetCode】力扣刷题热题100道(1-5题)附源码 链表 子串 中位数 回文子串(C++)
目录
1.两数之和
2.两数相加-链表
3.无重复字符的最长子串
4.寻找两个正序数组的中位数
5.最长回文子串
1.两数之和
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
第一种方法比较常规暴力枚举,时间复杂度: O(n^2)
,因为我们使用双重循环遍历数组,每次检查一对元素的和。
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {for (int i=0 ; i < nums.size() ; ++i) {for(int j=i+1 ; j<nums.size() ; ++j){if(nums[i]+nums[j] == target){return {i,j};}}}return {};}
};
第二种方法哈希表解法,时间复杂度: O(n)
,因为我们只遍历一次数组,对于每个元素的查找和插入操作,哈希表的时间复杂度是常数 O(1)
。
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> num_map;for (int i = 0; i < nums.size(); ++i) {int complement = target - nums[i]; if (num_map.find(complement) != num_map.end()){return {num_map[complement], i};}num_map[nums[i]] = i;}return {};}
};
假设 nums = [2, 7, 11, 15],目标值 target = 9。
第一轮:
当前元素是 nums[0] = 2,计算 complement = 9 - 2 = 7。
哈希表 num_map 为空,7 不在哈希表中。
将当前元素 nums[0] = 2 存入哈希表:num_map = {2: 0}。
第二轮:
当前元素是 nums[1] = 7,计算 complement = 9 - 7 = 2。
哈希表 num_map = {2: 0},发现 complement = 2 在哈希表中,说明 nums[0] + nums[1] = 9。
返回结果:{0, 1}。
如何用哈希表来找到两个数?
问题的核心思想: 对于每一个元素 nums[i],我们希望在之前遍历的数组元素中,找到一个数 complement,使得 nums[i] + complement = target,从而满足题目条件。也就是:
complement=target−nums[i]\text{complement} = \text{target} - \text{nums}[i]complement=target−nums[i]
这样,我们就可以通过查找哈希表中是否存在 complement 来判断是否找到了匹配的两个数。
为什么哈希表有效?
哈希表是一个常数时间查找结构: 使用哈希表存储之前遍历过的元素,每个元素和其下标都作为键值对存储。查找一个元素是否在哈希表中存在的时间复杂度为 O(1)。
早期发现匹配: 在遍历数组时,我们可以在当前元素 nums[i] 被处理之前,检查 target - nums[i] 是否已经出现在哈希表中。这样,查找操作变得非常高效,我们能快速确定某个值是否已经出现在数组的前面部分。
解释为什么能找到配对:
思考过程: 对于每一个元素 nums[i],我们在遍历过程中都计算出当前元素和目标值的差值 complement = target - nums[i]。然后我们查找哈希表中是否存在 complement,如果存在,就说明存在两个数,它们的和为 target。
哈希表的作用: 哈希表的作用是记录我们已经遍历过的元素,所以当我们遇到某个元素时,我们只需要查找它的差值是否已经存在。这样就可以快速找到一对数。
为什么可以在 O(n) 时间内找到答案:一遍扫描: 在遍历数组时,我们只需要对每个元素进行一次查找和插入操作,且每次查找和插入的时间复杂度是常数 O(1)。
不需要重复扫描: 不像暴力解法需要两层循环去遍历数组的每一对元素,哈希表方法只需要遍历一次数组。
2.两数相加-链表
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode *head = new ListNode(0);ListNode *current = head;int carry = 0;while(l1 != nullptr || l2 != nullptr || carry != 0){int data1 = (l1 != nullptr) ? l1->val : 0;int data2 = (l2 != nullptr) ? l2->val : 0;int sum = data1 + data2 + carry;carry = sum / 10;current->next = new ListNode(sum % 10);current=current->next;if(l1 != nullptr) l1 = l1->next;if(l2 != nullptr) l2 = l2->next;}return head->next;}
};
该 while 循环继续执行,直到两个链表都遍历完且没有进位。也就是说:
如果 l1 和 l2 都为空,但 carry 不为零(即最后一次加法有进位),我们仍然需要处理进位。
在每次循环中,我们从 l1 和 l2 中提取当前节点的值(如果节点为空则默认为 0)。
然后,将两个节点的值和进位相加,得到当前位的和。
使用 sum / 10 计算进位,sum % 10 作为当前位的结果。
将当前位的结果存入新节点,并更新 current 指针。
3.无重复字符的最长子串
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
(子字符串 是字符串中连续的 非空 字符序列)
class Solution {
public:int lengthOfLongestSubstring(string s) {unordered_set<char> char_set; int left = 0; int max_len = 0; for (int right = 0; right < s.size(); ++right) {while (char_set.find(s[right]) != char_set.end()) {char_set.erase(s[left]);left++;}char_set.insert(s[right]);max_len = max(max_len, right - left + 1);}return max_len;}
};
我们来针对输入 "abcabcbb"这个测试用例来讲解,如下所示:
初始化
char_set: 是一个 unordered_set,用于存储当前窗口内的字符,确保窗口内的字符是唯一的。
left: 左指针,初始值为 0,表示窗口的左边界。
max_len: 用于记录最长无重复子串的长度,初始值为 0。
遍历字符串
我们通过 right 指针从左到右遍历字符串 s,并不断更新 max_len。
输入字符串为 "abcabcbb",其长度为 8。我们按每次循环逐步分析。
第 1 次循环 (right = 0)
当前字符 s[right] = 'a'。
检查 char_set 是否包含 'a',char_set.find('a') 返回 char_set.end(),说明没有重复字符。
将 'a' 插入到 char_set 中:char_set = {'a'}。
计算当前窗口的长度 right - left + 1 = 0 - 0 + 1 = 1,更新 max_len = max(0, 1) = 1。
第 2 次循环 (right = 1)
当前字符 s[right] = 'b'。
检查 char_set 是否包含 'b',char_set.find('b') 返回 char_set.end(),说明没有重复字符。
将 'b' 插入到 char_set 中:char_set = {'a', 'b'}。
计算当前窗口的长度 right - left + 1 = 1 - 0 + 1 = 2,更新 max_len = max(1, 2) = 2。
第 3 次循环 (right = 2)
当前字符 s[right] = 'c'。
检查 char_set 是否包含 'c',char_set.find('c') 返回 char_set.end(),说明没有重复字符。
将 'c' 插入到 char_set 中:char_set = {'a', 'b', 'c'}。
计算当前窗口的长度 right - left + 1 = 2 - 0 + 1 = 3,更新 max_len = max(2, 3) = 3。
第 4 次循环 (right = 3)
当前字符 s[right] = 'a'。
检查 char_set 是否包含 'a',char_set.find('a') 返回非 char_set.end(),说明有重复字符。
进入 while 循环,开始调整窗口的左边界 left:
移除 s[left] = 'a' 从 char_set 中:char_set = {'b', 'c'}。
左指针右移:left = 1。
继续检查 char_set 是否包含 'a',此时不再包含 'a'。
将 'a' 插入到 char_set 中:char_set = {'b', 'c', 'a'}。
计算当前窗口的长度 right - left + 1 = 3 - 1 + 1 = 3,max_len 不变,仍为 3。
第 5 次循环 (right = 4)
当前字符 s[right] = 'b'。
检查 char_set 是否包含 'b',char_set.find('b') 返回非 char_set.end(),说明有重复字符。
进入 while 循环,开始调整窗口的左边界 left:
移除 s[left] = 'b' 从 char_set 中:char_set = {'c', 'a'}。
左指针右移:left = 2。
继续检查 char_set 是否包含 'b',此时不再包含 'b'。
将 'b' 插入到 char_set 中:char_set = {'c', 'a', 'b'}。
计算当前窗口的长度 right - left + 1 = 4 - 2 + 1 = 3,max_len 不变,仍为 3。
第 6 次循环 (right = 5)
当前字符 s[right] = 'c'。
检查 char_set 是否包含 'c',char_set.find('c') 返回非 char_set.end(),说明有重复字符。
进入 while 循环,开始调整窗口的左边界 left:
移除 s[left] = 'c' 从 char_set 中:char_set = {'a', 'b'}。
左指针右移:left = 3。
继续检查 char_set 是否包含 'c',此时不再包含 'c'。
将 'c' 插入到 char_set 中:char_set = {'a', 'b', 'c'}。
计算当前窗口的长度 right - left + 1 = 5 - 3 + 1 = 3,max_len 不变,仍为 3。
第 7 次循环 (right = 6)
当前字符 s[right] = 'b'。
检查 char_set 是否包含 'b',char_set.find('b') 返回非 char_set.end(),说明有重复字符。
进入 while 循环,开始调整窗口的左边界 left:
移除 s[left] = 'a' 从 char_set 中:char_set = {'b', 'c'}。
左指针右移:left = 4。
继续检查 char_set 是否包含 'b',此时不再包含 'b'。
将 'b' 插入到 char_set 中:char_set = {'b', 'c'}。
计算当前窗口的长度 right - left + 1 = 6 - 4 + 1 = 3,max_len 不变,仍为 3。
第 8 次循环 (right = 7)
当前字符 s[right] = 'b'。
检查 char_set 是否包含 'b',char_set.find('b') 返回非 char_set.end(),说明有重复字符。
进入 while 循环,开始调整窗口的左边界 left:
移除 s[left] = 'b' 从 char_set 中:char_set = {'c'}。
左指针右移:left = 5。
继续检查 char_set 是否包含 'b',此时不再包含 'b'。
将 'b' 插入到 char_set 中:char_set = {'c', 'b'}。
计算当前窗口的长度 right - left + 1 = 7 - 5 + 1 = 3,max_len 不变,仍为 3。
4.寻找两个正序数组的中位数
给定两个大小分别为 m
和 n
的正序(从小到大)数组 nums1
和 nums2
。请你找出并返回这两个正序数组的 中位数 。算法的时间复杂度应该为 O(log (m+n))
。
方法一:(不推荐)
class Solution {
public:double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {vector<int> merged;double median = 0;int i=0,j=0;while(i < nums1.size() && j < nums2.size()){if(nums1[i] < nums2[j]){merged.push_back(nums1[i]);i++;} else {merged.push_back(nums2[j]);j++;}}while (i < nums1.size()) {merged.push_back(nums1[i]);i++;}while(j < nums2.size()){merged.push_back(nums2[j]);j++;}int n = merged.size();if (n % 2 == 0) {median = (merged[n / 2 - 1] + merged[n / 2]) / 2.0;} else {median = merged[n / 2];}return median;}
};
使用双指针 i 和 j 分别指向 nums1 和 nums2 的起始位置。
比较 nums1[i] 和 nums2[j],将较小的元素放入 merged 数组。
将较小元素的指针后移(即,继续检查数组中的下一个元素)。
直到一个数组被完全遍历。
如果 nums1 还有剩余元素,将其直接追加到 merged 中。
同样地,如果 nums2 还有剩余元素,也直接追加到 merged 中。
这样,merged 就是一个完整的、合并后的有序数组。
首先获取 merged 数组的大小 n。
如果 n 是偶数:
中位数是数组中间两个数的平均值,即 (merged[n / 2 - 1] + merged[n / 2]) / 2.0。
如果 n 是奇数:
中位数是数组的中间元素,即 merged[n / 2]。
方法二:
class Solution {
public:double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {// 确保 nums1 是较短的数组if (nums1.size() > nums2.size()) {return findMedianSortedArrays(nums2, nums1);}int m = nums1.size();int n = nums2.size();int totalLeft = (m + n + 1) / 2;int left = 0, right = m;while (left < right) {int i = left + (right - left) / 2;int j = totalLeft - i;if (nums1[i] < nums2[j - 1]) {// i 需要右移left = i + 1;} else {// i 需要左移right = i;}}int i = left;int j = totalLeft - i;// 左半部分的最大值int nums1LeftMax = (i == 0) ? INT_MIN : nums1[i - 1];int nums2LeftMax = (j == 0) ? INT_MIN : nums2[j - 1];int leftMax = max(nums1LeftMax, nums2LeftMax);// 如果总长度是奇数if ((m + n) % 2 == 1) {return leftMax;}// 右半部分的最小值int nums1RightMin = (i == m) ? INT_MAX : nums1[i];int nums2RightMin = (j == n) ? INT_MAX : nums2[j];int rightMin = min(nums1RightMin, nums2RightMin);// 如果总长度是偶数,返回平均值return (leftMax + rightMin) / 2.0;}
};
1. 确保 nums1 是较短的数组
通过判断 nums1 和 nums2 的长度,始终在较短的数组上进行二分查找。
2. 使用二分查找调整分割点
i 是在 nums1 的分割点,j 是在 nums2 的分割点。
i + j = totalLeft,保证左半部分元素总数等于右半部分。
根据条件调整 i:
如果 nums1[i] < nums2[j - 1],说明 i 需要右移。
如果 nums1[i] >= nums2[j - 1],说明 i 满足条件或需要左移。
3. 计算中位数
左半部分最大值为:max(nums1[i-1], nums2[j-1])。
右半部分最小值为:min(nums1[i], nums2[j])。
如果总长度为奇数,直接返回左半部分最大值。
如果总长度为偶数,返回左右半部分最大值与最小值的平均值。
5.最长回文子串
给你一个字符串 s
,找到 s
中最长的 回文子串。
回文性
如果字符串向前和向后读都相同,则它满足 回文性子字符串
子字符串 是字符串中连续的 非空 字符序列。
动态规划法
class Solution {
public:string longestPalindrome(string s) {int n = s.size();if (n <= 1) return s;vector<vector<bool>> dp(n, vector<bool>(n, false));int start = 0, maxLen = 1;for (int i = 0; i < n; ++i) dp[i][i] = true;for (int i = 0; i < n - 1; ++i) {if (s[i] == s[i + 1]) {dp[i][i + 1] = true;start = i;maxLen = 2;}}for (int len = 3; len <= n; ++len) {for (int i = 0; i + len - 1 < n; ++i) {int j = i + len - 1;if (s[i] == s[j] && dp[i + 1][j - 1]) {dp[i][j] = true;start = i;maxLen = len;}}}return s.substr(start, maxLen);}
};
首先,我们获取字符串 s 的长度 n。如果字符串长度小于或等于 1,则字符串本身就是回文的(单个字符本身就是回文),直接返回字符串。
dp 是一个二维布尔型数组,dp[i][j] 用来表示子串 s[i...j] 是否为回文串。数组大小为 n x n,初始化为 false。
每个单字符子串(即 s[i...i])自然是回文的,因此将 dp[i][i] 设置为 true。
接下来,我们处理长度为 2 的子串。如果 s[i] == s[i+1],那么 s[i...i+1] 是回文串,设置 dp[i][i+1] = true。此时,我们还更新 start 和 maxLen,记录最长回文子串的起始位置和长度。
从长度为 3 的子串开始,我们逐步扩展到更长的回文子串。具体来说,len 表示当前子串的长度,从 3 一直增加到 n。
对于每个长度为 len 的子串,我们通过以下条件判断是否为回文:
s[i] == s[j]:当前子串的首尾字符相同。
dp[i+1][j-1]:即子串 s[i+1...j-1] 是否是回文。
如果这两个条件都成立,那么 s[i...j] 也是回文子串,更新 dp[i][j] = true,并更新 start 和 maxLen,记录当前最长回文子串的起始位置和长度。
输入字符串 s = "babad":
长度为 1 的子串:我们从一开始就知道每个单独的字符都是一个回文子串,所以 dp[i][i] = true 对于所有 i 都成立。对于 s = "babad",初始化时,dp 数组是这样的:
dp = [ [true, false, false, false, false], [false, true, false, false, false], [false, false, true, false, false], [false, false, false, true, false], [false, false, false, false, true] ]
长度为 2 的子串:接着,代码检查相邻的字符是否相同。如果相同,设置 dp[i][i+1] = true。在 s = "babad" 中,s[0] != s[1](b != a),s[1] != s[2](a != b),s[2] != s[3](b != a),s[3] != s[4](a != d)。所以 dp 数组没有更新。
dp 仍然是:
dp = [ [true, false, false, false, false], [false, true, false, false, false], [false, false, true, false, false], [false, false, false, true, false], [false, false, false, false, true] ]
长度为 3 及以上的回文子串:接着,程序检查长度为 3 及以上的子串,逐步扩展回文子串的长度。对每一个 len(长度从 3 到 n),我们依次检查每个子串的起始位置 i。
当 len = 3 时:
对于 s[0...2] = "bab",s[0] == s[2](b == b),并且 dp[1][1] = true(即 "a" 是回文)。所以 dp[0][2] = true,start = 0,maxLen = 3。
现在 dp 数组更新为:
dp = [ [true, false, true, false, false], [false, true, false, false, false], [false, false, true, false, false], [false, false, false, true, false], [false, false, false, false, true] ]
这时,我们已经找到了 "bab" 作为一个回文子串。
继续检查更长的回文子串:当 len = 4 时:
对于 s[1...4] = "abad",s[1] != s[4](a != d),所以 dp[1][4] 不会被设置。
当 len = 5 时:
对于 s[0...4] = "babad",s[0] != s[4](b != d),所以 dp[0][4] 也不会被设置。
经过这些步骤,程序最终会返回最长的回文子串 "bab",因为 start = 0 和 maxLen = 3。
相关文章:

【LeetCode】力扣刷题热题100道(1-5题)附源码 链表 子串 中位数 回文子串(C++)
目录 1.两数之和 2.两数相加-链表 3.无重复字符的最长子串 4.寻找两个正序数组的中位数 5.最长回文子串 1.两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。…...
Docker启动失败 - 解决方案
Docker启动失败 - 解决方案 问题原因解决方案service问题 问题 重启docker失败: toolchainendurance:~$ sudo systemctl restart docker Job for docker.service failed because:the control process exited with error codesee:"systemctl status docker.se…...
【Duilib】 List控件支持多选和获取选择的多条数据
问题 使用Duilib库写的一个UI页面用到了List控件,功能变动想支持选择多行数据。 分析 1、List控件本身支持使用SetMultiSelect接口设置是否多选: void SetMultiSelect(bool bMultiSel);2、List控件本身支持使用GetNextSelItem接口获取选中的下一个索引…...

android系统的一键编译与非一键编译 拆包 刷机方法
1.从远程仓库下载源码 别人已经帮我下载好了在Ubuntu上。并给我权限:chmod -R ow /data/F200/F200-master/ 2.按照readme.txt步骤操作 安装编译环境: sudo apt-get update sudo apt-get install git-core gnupg flex bison gperf build-essential z…...
SQL语言的函数实现
SQL语言的函数实现 引言 随着大数据时代的到来,数据的存储和管理变得越来越复杂。SQL(结构化查询语言)作为关系数据库的标准语言,其重要性不言而喻。在SQL语言中,函数是一个重要的组成部分,可以有效地帮助…...

OSPF - 2、3类LSA(Network-LSA、NetWork-Sunmmary-LSA)
前篇博客有对常用LSA的总结 2类LSA(Network-LSA) DR产生泛洪范围为本区域 作用: 描述MA网络拓扑信息和网络信息,拓扑信息主要描述当前MA网络中伪节点连接着哪几台路由。网络信息描述当前网络的 掩码和DR接口IP地址。 影响邻居建立中说到…...

运动相机拍摄的视频打不开怎么办
3-10 GoPro和大疆DJI运动相机的特点,小巧、高清、续航长、拍摄稳定,很多人会在一些重要场合用来拍摄视频,比如可以用来拿在手里拍摄快速运动中的人等等。 但是毕竟是电子产品,有时候是会出点问题的,比如意外断电、摔重…...
SpringBoot | 使用Apache POI库读取Excel文件介绍
关注WX:CodingTechWork 介绍 在日常开发中,我们经常需要处理Excel文件中的数据。无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到需要读取和操作Excel文件的场景。本文将详细介绍如何使用Java中的Apache PO…...
从configure.ac到构建环境:解析Mellanox OFED内核模块构建脚本
在软件开发过程中,特别是在处理复杂的内核模块如Mellanox OFED(OpenFabrics Enterprise Distribution)时,构建一个可移植且高效的构建系统至关重要。Autoconf和Automake等工具在此过程中扮演着核心角色。本文将深入解析一个用于准备Mellanox OFED内核模块构建环境的Autocon…...

c#使用SevenZipSharp实现压缩文件和目录
封装了一个类,方便使用SevenZipSharp,支持加入进度显示事件。 双重加密压缩工具范例: using SevenZip; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.…...

【从0带做】基于Springboot3+Vue3的高校食堂点餐系统
大家好,我是武哥,最近给大家手撸了一个基于SpringBoot3Vue3的高校食堂点餐系统,可用于毕业设计、课程设计、练手学习,系统全部原创,如有遇到网上抄袭站长的,欢迎联系博主~ 详细介绍 https://www.javaxm.c…...

2025年01月09日Github流行趋势
1. 项目名称:khoj 项目地址url:https://github.com/khoj-ai/khoj项目语言:Python历史star数:22750今日star数:1272项目维护者:debanjum, sabaimran, MythicalCow, aam-at, eltociear项目简介:你…...

PostgreSQL学习笔记(二):PostgreSQL基本操作
PostgreSQL 是一个功能强大的开源关系型数据库管理系统 (RDBMS),支持标准的 SQL 语法,并扩展了许多功能强大的操作语法. 数据类型 数值类型 数据类型描述存储大小示例值SMALLINT小范围整数,范围:-32,768 到 32,7672 字节-123INTE…...
关于内网外网,ABC类地址,子网掩码划分
本文的三个关键字是:内网外网,ABC类地址,子网掩码划分。围绕以下问题展开: 如何从ip区分外网、内网?win和linux系统中,如何查询自己的内网ip和外网ip。开发视角看内外网更多是处于安全考虑,接口…...

nginx 配置 本地启动
1.nginx下载地址:nginx: download nginx详解:Nginx配置终极版指南(全网最详细)_nginx_脚本之家 2.vue 项目打包生成dist文件里面的文件复制到下载好的nginx的html目录下 3.配置nginx配置文件 打包生成的dist前端包都是属于生产环…...

UE5 打包要点
------------------------- 1、需要环境 win sdk ,大约3G VS,大约10G 不安装就无法打包,就是这么简单。 ----------------------- 2、打包设置 编译类型,开发、调试、发行 项目设置-地图和模式,默认地图 项目…...
OneFlow的简单介绍
OneFlow 是北京一流科技有限公司旗下的采用全新架构设计的开源工业级通用深度学习框架。以下是关于 OneFlow 的详细介绍: 本篇文章的目录 特点 功能 应用场景 发展历程 特点 简洁易用的接口:为深度学习相关的算法工程师提供一套简洁易用的用户接口…...

聊一聊 C#异步 任务延续的三种底层玩法
一:背景 1. 讲故事 最近聊了不少和异步相关的话题,有点疲倦了,今天再写最后一篇作为近期这类话题的一个封笔吧,下篇继续写我熟悉的 生产故障 系列,突然亲切感油然而生,哈哈,免费给别人看程序故…...

(k8s)Flannel Error问题解决!
1.问题描述 书接上回,我们在解决kubectl不断重启的时候引入了Flannel 网络插件,但是一上来就报错, 2.问题解决 自己的思路:照例开始检查 1.先检查一下目前Flannel的pod kubectl get pods --all-namespaces 2.检查 Flannel的po…...

Delaunay三角刨分算法理解及c#过程实现
Delaunay三角刨分算法理解及c#过程实现 0 引言1 关于三角剖分2 Delaunay三角剖分算法实现及对比3 结语0 引言 💻💻AI一下💻💻 三角剖分是什么? 三角剖分是一种将平面或曲面划分成三角形集合的方法。在二维平面中,给定一个平面区域(可以是多边形等),通过连接区域…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...

消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...

GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...