链表+哈希表 | CPP+LeetCode

C++手写拉链法的哈希表【LeetCode705 设计哈希集合】 哈希表概述 为了实现哈希表这个数据结构,有两个关键的问题,即哈希函数和冲突处理。 哈希函数:目的是分配一个地址存储值。理想情况下,每个值都应该有一个对应唯一的散列值。 冲突处理:哈希函数的本质就是从 A 映射到 B。但是多个 A 值可能映射到相同的 B。这就是碰撞。因此,我们需要有对应的策略来解决碰撞。 总的来说,有以下几种策略解决冲突: 拉链法:对于相同的散列值,我们将它们放到一个桶中,每个桶是相互独立的。 线性探测法:每当有碰撞, 则根据我们探查的策略找到一个空的槽为止。 再散列法:使用两 阅读详情

后面有 C++ 中哈希标中set,map,数组之间的区别。


LCR 021. 删除链表的倒数第 N 个结点

给定一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

/**
 * 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* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummyHead = new ListNode(0);
        dummyHead -> next = head;
        ListNode* left = dummyHead;
        ListNode* right = dummyHead;
        n++;
        while(n--)
        {
            right = right -> next;
        }
        while(right)
        {
            right = right -> next;
            left = left -> next;
        }
        ListNode* temp = left -> next;
        left -> next = left -> next -> next;
        delete(temp);
        return dummyHead -> next;
    }
};

141. 环形链表

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool hasCycle(ListNode *head) {
        ListNode* slow = head;
        ListNode* fast = head;
        while(fast && fast -> next)
        {
            fast = fast -> next -> next;
            slow = slow -> next;
            if(fast == slow)
            {
                return true;
            }
        }
        return false;
    }
};

142. 环形链表 II

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* fast = head;
        ListNode* slow = head;
        while(fast && fast -> next)
        {
            slow = slow -> next;
            fast = fast -> next -> next;
            if(slow == fast)
            {
                while(head != fast)
                {
                    head = head -> next;
                    fast = fast -> next;
                }
                return fast;
            }
        }
        return nullptr;
    }
};

LCR 032. 有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断它们是不是一组变位词(字母异位词)。

注意:若 *s* 和 *t* 中每个字符出现的次数都相同且字符顺序不完全相同,则称 *s* 和 *t* 互为变位词(字母异位词)。

class Solution {
public:
    bool isAnagram(string s, string t) {
        if(s.length() != t.length())
        {
            return false;
        }
        if(s == t)
        {
            return false;
        }
        vector<int> table (26,0);
        for(auto& ch : s)
        {
            table[ch - 'a']++;
        }
        for(auto& ch : t)
        {
            table[ch - 'a']--;
            if(table[ch - 'a'] < 0)
            {
                return false;
            }
        }
        return true;
    }
};

349. 两个数组的交集

给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> st(nums1.begin(), nums1.end());
        vector<int> ans;
        for(int& x:nums2)
        {
            if(st.erase(x))
                ans.push_back(x);
        }
        return ans;
    }
};

1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int,int> idx;
        for(int j = 0; ;j++)
        {
            auto it = idx.find(target - nums[j]);
            if(it != idx.end())
            {
                return {it -> second , j};
            }
            idx[nums[j]] = j;
        }
    }
};

454. 四数相加 II

给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:

  • 0 <= i, j, k, l < n
  • nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
        unordered_map<int,int> cnt;
        for(int&a :nums1)
        {
            for(int&b : nums2)
            {
                cnt[a+b]++;
            }
        }
        int ans = 0;
        for(int&c :nums3)
        {
            for(int&d : nums4)
            {
                int target = 0 - c - d;
                ans += cnt[target];
            }
        }
        return ans;
    }
};

15. 三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

**注意:**答案中不可以包含重复的三元组。

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 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.push_back({x,nums[left],nums[right]});
                    left++;
                    right--;
                    while(left < right && nums[left] == nums[left-1]) left++;
                    while(left < right && nums[right] == nums[right+1]) right--;
                }
            }
        }
        return ans;
    }
};

18. 四数之和

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • a、b、c 和 d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意顺序 返回答案 。

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> ans;
        ranges::sort(nums);
        int n = nums.size();
        for(int k = 0;k < n - 3;k++)
        {
            long long x = nums[k];
            if(x + nums[k+1] + nums[k+2] + nums[k+3] > target) break;
            if(x + nums[n-1] + nums[n-2] + nums[n-3] < target) continue;
            if(k > 0 && nums[k] == nums[k-1]) continue;
            for(int i = k+1;i < n - 2;i++)
            {
                long long y = nums[i];
                if(x + y + nums[i+1] + nums[i+2] > target) break;
                if(x + nums[n-1] + nums[n-2] + y < target) continue;
                if(i > k + 1 && y == nums[i - 1]) continue;
                int left = i + 1;
                int right = n - 1;
                while(left < right)
                {
                    long long s = x + y + nums[left] + nums[right] - target;
                    if(s > 0) right--;
                    else if(s < 0) left++;
                    else
                    {
                        ans.push_back({(int)x,(int)y,nums[left],nums[right]});
                        for(left++;left < right && nums[left] == nums[left - 1];left++);
                        for(right--;left < right && nums[right] == nums[right + 1];right--);
                    }
                }
            }
        }
        return ans;
    }
};

C++ 数组、set、map 对比

特性数组 (array/vector)setmap
存储内容单一值单一值(不重复)键值对(key-value)
元素顺序按插入顺序/索引自动排序按 key 自动排序
重复元素✅ 允许❌ 不允许key 不允许,value 允许
访问方式索引 arr[i]迭代器/findmap[key] 或 find
查找复杂度O(n)O(log n)O(log n)
插入复杂度O(1) 尾部 / O(n) 中间O(log n)O(log n)
底层实现连续内存红黑树红黑树

1. 数组 / vector

#include <vector>
#include <iostream>

int main() {
    std::vector<int> arr = {3, 1, 4, 1, 5};  // 允许重复
    
    arr.push_back(9);       // 尾部添加
    arr[0] = 10;            // 按索引修改
    
    for (int x : arr) {
        std::cout << x << " ";  // 输出: 10 1 4 1 5 9
    }
    return 0;
}

适用场景:需要按位置访问、允许重复、频繁尾部操作


2. set

#include <set>
#include <iostream>

int main() {
    std::set<int> s = {3, 1, 4, 1, 5};  // 重复的 1 会被忽略
    
    s.insert(2);
    s.erase(4);
    
    for (int x : s) {
        std::cout << x << " ";  // 输出: 1 2 3 5(自动排序)
    }
    
    // 查找
    if (s.find(3) != s.end()) {
        std::cout << "\n找到 3" << std::endl;
    }
    
    // C++20: s.contains(3)
    return 0;
}

适用场景:去重、快速判断元素是否存在、需要有序


3. map

#include <map>
#include <iostream>
#include <string>

int main() {
    std::map<std::string, int> m;
    
    m["apple"] = 5;
    m["banana"] = 3;
    m["apple"] = 10;  // 覆盖原值
    
    // 遍历(按 key 字母序排序)
    for (auto& [key, value] : m) {
        std::cout << key << ": " << value << std::endl;
    }
    // 输出:
    // apple: 10
    // banana: 3
    
    // 查找
    if (m.find("apple") != m.end()) {
        std::cout << "apple 的值: " << m["apple"] << std::endl;
    }
    
    return 0;
}

适用场景:键值对映射、根据 key 快速查 value、统计计数


无序版本(哈希表,O(1) 查找)

有序版无序版(更快)
std::setstd::unordered_set
std::mapstd::unordered_map
#include <unordered_map>

std::unordered_map<std::string, int> um;
um["key"] = 100;  // O(1) 平均查找/插入

快速选择指南

需要按索引访问?          → vector
需要去重?                → set / unordered_set
需要键值对映射?          → map / unordered_map
需要排序?                → set / map
只需要快速查找(不排序)? → unordered_set / unordered_map
允许重复且需要排序?      → multiset / multimap

C++ set / unordered_set / multiset 对比

特性setunordered_setmultiset
重复元素❌ 不允许❌ 不允许✅ 允许
元素顺序有序(升序)无序有序(升序)
底层实现红黑树哈希表红黑树
查找/插入O(log n)O(1) 平均O(log n)
头文件<set><unordered_set><set>

1. set(有序 + 去重)

#include <set>
#include <iostream>

int main() {
    std::set<int> s = {5, 2, 8, 2, 1, 5};
    
    s.insert(3);
    
    for (int x : s) {
        std::cout << x << " ";
    }
    // 输出: 1 2 3 5 8(自动排序,重复被去除)
    
    // 查找
    if (s.count(5)) {  // count 只返回 0 或 1
        std::cout << "\n找到 5";
    }
    
    return 0;
}

2. unordered_set(无序 + 去重 + 更快)

#include <unordered_set>
#include <iostream>

int main() {
    std::unordered_set<int> us = {5, 2, 8, 2, 1, 5};
    
    us.insert(3);
    
    for (int x : us) {
        std::cout << x << " ";
    }
    // 输出顺序不确定,如: 1 8 2 5 3(去重但无序)
    
    // 查找 O(1)
    if (us.find(5) != us.end()) {
        std::cout << "\n找到 5";
    }
    
    return 0;
}

3. multiset(有序 + 允许重复)

#include <set>
#include <iostream>

int main() {
    std::multiset<int> ms = {5, 2, 8, 2, 1, 5};
    
    ms.insert(2);  // 可以继续插入重复值
    
    for (int x : ms) {
        std::cout << x << " ";
    }
    // 输出: 1 2 2 2 5 5 8(有序,保留所有重复)
    
    // count 返回该元素的个数
    std::cout << "\n2 出现了 " << ms.count(2) << " 次";  // 输出: 3
    
    // 删除所有值为 2 的元素
    ms.erase(2);  // 删除全部
    
    // 只删除一个
    // ms.erase(ms.find(2));
    
    return 0;
}

删除操作区别(multiset 注意点)

std::multiset<int> ms = {1, 2, 2, 2, 3};

// 方式1: erase(值) —— 删除所有该值
ms.erase(2);  // 删除全部 2,剩 {1, 3}

// 方式2: erase(迭代器) —— 只删除一个
ms.erase(ms.find(2));  // 只删除一个 2,剩 {1, 2, 2, 3}

实际应用场景

容器典型场景
set去重 + 需要有序输出、维护有序集合
unordered_set快速判断元素存在性、大数据去重
multiset维护有序序列允许重复、滑动窗口中位数、优先队列替代

快速选择

需要去重吗?
├── 是 → 需要有序吗?
│        ├── 是 → set
│        └── 否 → unordered_set(更快)
└── 否 → 需要有序吗?
         ├── 是 → multiset
         └── 否 → vector(直接存)

补充:unordered_multiset

还有 unordered_multiset:无序 + 允许重复

#include <unordered_set>

std::unordered_multiset<int> ums = {1, 2, 2, 3};
ums.insert(2);
std::cout << ums.count(2);  // 输出: 3

C++ map / unordered_map / multimap 对比

特性mapunordered_mapmultimap
key 重复❌ 不允许❌ 不允许✅ 允许
元素顺序按 key 有序无序按 key 有序
底层实现红黑树哈希表红黑树
查找/插入O(log n)O(1) 平均O(log n)
[] 访问✅ 支持✅ 支持❌ 不支持
头文件<map><unordered_map><map>

1. map(key 有序 + 不重复)

#include <map>
#include <iostream>
#include <string>

int main() {
    std::map<std::string, int> m;
    
    m["banana"] = 3;
    m["apple"] = 5;
    m["cherry"] = 2;
    m["apple"] = 10;  // 覆盖原值
    
    // 按 key 字母序遍历
    for (auto& [key, val] : m) {
        std::cout << key << ": " << val << std::endl;
    }
    // 输出:
    // apple: 10
    // banana: 3
    // cherry: 2
    
    // 查找
    if (m.find("apple") != m.end()) {
        std::cout << "apple = " << m["apple"] << std::endl;
    }
    
    // [] 访问不存在的 key 会自动创建(值初始化为 0)
    std::cout << m["durian"] << std::endl;  // 输出: 0
    
    return 0;
}

2. unordered_map(key 无序 + 不重复 + 更快)

#include <unordered_map>
#include <iostream>
#include <string>

int main() {
    std::unordered_map<std::string, int> um;
    
    um["banana"] = 3;
    um["apple"] = 5;
    um["cherry"] = 2;
    
    // 遍历顺序不确定
    for (auto& [key, val] : um) {
        std::cout << key << ": " << val << std::endl;
    }
    // 输出顺序可能是: cherry: 2, apple: 5, banana: 3
    
    // O(1) 查找
    if (um.count("apple")) {
        std::cout << "apple = " << um["apple"] << std::endl;
    }
    
    // 统计字符出现次数(经典用法)
    std::string s = "hello";
    std::unordered_map<char, int> freq;
    for (char c : s) {
        freq[c]++;
    }
    // freq: h=1, e=1, l=2, o=1
    
    return 0;
}

3. multimap(key 有序 + 允许重复 key)

#include <map>
#include <iostream>
#include <string>

int main() {
    std::multimap<std::string, int> mm;
    
    mm.insert({"apple", 5});
    mm.insert({"banana", 3});
    mm.insert({"apple", 10});  // 同一 key 可以有多个值
    mm.insert({"apple", 8});
    
    // 按 key 有序遍历
    for (auto& [key, val] : mm) {
        std::cout << key << ": " << val << std::endl;
    }
    // 输出:
    // apple: 5
    // apple: 10
    // apple: 8
    // banana: 3
    
    // ❌ 不能用 mm["apple"],只能用 find
    
    // 查找某个 key 的所有值
    auto range = mm.equal_range("apple");
    std::cout << "\napple 的所有值: ";
    for (auto it = range.first; it != range.second; ++it) {
        std::cout << it->second << " ";
    }
    // 输出: 5 10 8
    
    // count 返回该 key 的元素个数
    std::cout << "\napple 有 " << mm.count("apple") << " 个" << std::endl;
    
    return 0;
}

重要操作对比

插入
// map / unordered_map
m["key"] = value;           // 覆盖式插入
m.insert({"key", value});   // 如果 key 存在则不插入

// multimap(不支持 [])
mm.insert({"key", value});  // 总是插入,即使 key 存在
删除
// map / unordered_map
m.erase("key");  // 删除该 key

// multimap
mm.erase("apple");  // 删除所有 key="apple" 的元素
mm.erase(mm.find("apple"));  // 只删除一个
查找 multimap 的所有值
std::multimap<int, std::string> mm;
mm.insert({1, "a"});
mm.insert({1, "b"});
mm.insert({1, "c"});

// 方法1: equal_range
auto [begin, end] = mm.equal_range(1);
for (auto it = begin; it != end; ++it) {
    std::cout << it->second << " ";
}

// 方法2: 循环(C++17)
for (auto it = mm.find(1); it != mm.end() && it->first == 1; ++it) {
    std::cout << it->second << " ";
}

实际应用场景

容器典型场景
map需要按 key 排序、有序遍历字典
unordered_map快速查找、统计频率、缓存映射
multimap一个 key 对应多个 value、存储一对多关系

例子:

// 统计每个单词出现次数 → unordered_map
std::unordered_map<std::string, int> wordCount;

// 按成绩分组学生(成绩可能相同)→ multimap
std::multimap<int, std::string> scoreToName;
scoreToName.insert({90, "Alice"});
scoreToName.insert({90, "Bob"});
scoreToName.insert({85, "Charlie"});

快速选择

key 会重复吗?
├── 否 → 需要按 key 排序吗?
│        ├── 是 → map
│        └── 否 → unordered_map(更快)
└── 是 → 需要按 key 排序吗?
         ├── 是 → multimap
         └── 否 → unordered_multimap

补充:unordered_multimap

#include <unordered_map>

std::unordered_multimap<std::string, int> umm;
umm.insert({"apple", 5});
umm.insert({"apple", 10});

std::cout << umm.count("apple");  // 输出: 2

无序 + 允许 key 重复,但实际用得较少。

STM32F103VET6实战:用W25Q64外部Flash实现Bootloader远程升级(含完整代码解析) 本文详细介绍了基于STM32F103VET6与W25Q64外部Flash的Bootloader远程升级实现方案,包含硬件选型、存储分区策略、双校验机制及完整代码解析。通过SPI接口实现固件存储与升级,适用于物联网设备开发,提升OTA功能可靠性。 阅读详情

相关推荐

从驱动编译到数据传输:RK3588与FPGA的PCIe通信实战解析

本文详细解析了RK3588与FPGA通过PCIe通信的实战过程,涵盖驱动编译、数据传输及性能优化等关键步骤。通过XDMA驱动实现高效DMA传输,适用于视频处理、数据采集等高性能场景,帮助开发者快速掌握嵌入式系统中的PCIe通信技术。

weixin_29214691的博客 522

LeetCode:142. 环形链表 II(哈希表和快慢指针(龟兔赛跑)法 C++带详细注释)

LeetCode:142. 环形链表 II(哈希表和快慢指针(龟兔赛跑)法 C++带详细注释) /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *detectCycl

Axe涛的博客 234

Playwright与MCP协议结合:AI驱动的智能Web自动化测试实践

Web自动化测试是现代软件开发流程中保障产品质量的关键环节,其核心原理是通过程序模拟用户操作,对Web应用进行功能验证。传统自动化测试工具如Selenium和Playwright虽然提供了强大的API,但脚本编写和维护仍需较高的编程技能。随着AI技术的发展,智能测试成为新的趋势,它通过自然语言理解和自动化执行,显著降低了测试创建门槛。Model Context Protocol(MCP)作为一种连接AI模型与外部工具的开放协议,为自动化测试带来了“智能大脑”。通过将MCP与Playwright结合,测试人员

aoe41606的博客 604

【Hot 100 刷题计划】 LeetCode 146. LRU 缓存 | C++ 哈希表+双向链表

本文介绍了LeetCode 146题LRU缓存的实现方法。该数据结构需要同时满足O(1)时间复杂度的查找和更新操作,采用哈希表+双向链表的组合方案:哈希表负责快速查找,双向链表维护访问顺序。最近使用的节点放在链表头部,最久未使用的放在尾部。当缓存容量超限时,自动淘汰尾部节点。文中详细解释了为何选择双向链表而非单链表或数组,并提供了完整的C++实现代码,包括节点移除、头部插入等核心操作。该实现通过虚拟头尾节点简化了边界条件处理,确保操作的高效性和正确性。

qq_51233453的博客 259

Lane、PHY和Preset Value Bit

每个Lane支持不同的传输速度和带宽,例如PCIe 3.0中,一个Lane的传输速度可以达到8 GT/s(Giga Transfers per second),也就是1 GB/s(GigaBytes per second)。Preset Value Bit(预置值位)是在PCIe 3.0的Lane上新引入的一种机制,用于优化信号传输质量。PCIe设备可以包含多个Lane,例如x1、x4、x8、x16等,表示该设备同时使用的Lane数目,比如x16表示该设备采用了16个Lane,具有更高的传输速度和带宽。

weixin_58083606的博客 1296

R语言pls包实战:手把手教你用偏最小二乘(PLS)搞定高维数据回归(附完整代码与数据标准化避坑指南)

本文详细介绍了如何使用R语言的pls包进行偏最小二乘(PLS)回归分析,特别针对高维数据回归问题。通过完整的代码示例和数据标准化避坑指南,帮助读者掌握从数据预处理到模型优化的全流程,解决实际应用中的常见问题。

weixin_42662605的博客 350

【LeetCode算法题解-C++】138. 随机链表的复制 —— 哈希表妙解复杂链表深拷贝

本文介绍了LeetCode第138题“随机链表的复制”的解题思路。该题要求在深拷贝单链表时,处理特殊的random指针,其核心难点在于random指向的节点可能尚未创建。通过哈希表建立原节点与新节点的映射关系,分两步完成复制:先构建基础链表并记录映射,再根据映射回填random指针。C++实现采用虚拟头节点简化操作,时间复杂度O(N),空间复杂度O(N)。最后提出进阶优化思路,通过节点插入替代哈希表将空间复杂度降至O(1)。

SeeYouAgain_0715的博客 1164

CTF-Web习题:2019强网杯 UPLOAD

本题涉及知识点:代码审计、文件上传漏洞、反序列化漏洞

LJW123487的博客 1902

LeetCode 面试经典 150_链表_LRU 缓存(66_146_C++_中等)(哈希表 + 双向链表)

LeetCode 面试经典 150_链表_LRU 缓存(66_146_C++_中等) 题目描述: 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。 void put(int key, int value)

huayimenghan的博客 800

025、空间降噪与时域降噪:噪声抑制与细节保留的平衡艺术

《降噪技术的平衡艺术:空间与时域降噪的协同优化》 本文深入探讨了图像处理中空间降噪与时域降噪的技术原理与工程实践。空间降噪通过像素级处理提升单帧质量,而时域降噪则利用帧间信息增强稳定性。文章揭示了两种方法在实际应用中的矛盾点:过度降噪会导致细节损失,影响后续算法性能。作者结合车载环视系统等实战案例,详细分享了参数调优经验,包括运动自适应策略、边缘保持技巧和嵌入式平台优化方案。特别强调降噪的最终目标应服务于下游算法需求,而非单纯追求图像美观。文章为工程人员提供了从理论到实践的完整指导,展现了降噪技术在效果与性

sundong_81的博客 186

Freeswitch DTMF 按键无法接收问题修复

freeswitch 在接收到 update后,会更新成新的 payload type,但是给的200响应,仍然是旧的,这时候就会导致手机侧认识需要发送旧的payload,所以发到 fs 后就会导致直接丢包,不去处理RTP包了。呼叫时需要设置通道变量 rtp_manual_rtp_bugs=ACCEPT_ANY_PAYLOAD ,这时候FS 就不会对包的payload进行判断,直接判定通过。应该修复 freeswitch 给响应时,应该根据收到的 payload 发送给手机,但是一直未找到正确的路径。

2301_81507069的博客 373

力扣 Hot 100 刷题记录 - 环形链表

这道题不仅考察了对链表的理解,还涉及到了双指针技巧的运用。今天,我将分享我的解题思路和过程。在力扣(LeetCode)的刷题过程中,我遇到了一道经典的链表问题——这道题的关键在于如何判断链表中是否存在环。给定一个链表,判断链表中是否有环。:如果链表中有环,返回。

weixin_50893711的博客 588

【国密】基于SM2的协同签名与协同解密方案

两方协同签名指客户端与服务端协同完成签名、验签操作,具体实现方案参考了信工所专利[3]。在业务应用中,两方或多方的协同签名一般采用门限签名方案可以用来构造。门限密码算法在多方协作的相关场景中应用十分广泛,可以实现数据联合授权、认证、密钥安全恢复、密钥安全交换等需求,在诸多分布式多方计算协议中均可见其身影。在上述两方协同签名方案中,最巧妙的地方在于签名值s分量的构造,通过一些列数学变换,得以恢复。以下从两方协同签名方案介绍入手,介绍门限密码在协同签名中的应用。解决上述问题的关键在于门限密码算法的巧妙构造。

听雨草堂 8388

Day10-力扣142-707 环形链表

然后就开始第二个简单题,就怕链表定义的题,如果面试真的问到了,不会初始化链表岂不是很尴尬,然后就是增删查改各种……思路还是不太好想的,听了卡尔老师的思路然后又看了华南溜达虎老师的课感觉自己不适合搞算法。实现,用于存储唯一的元素。它提供了快速的查找、插入和删除操作,非常适合用来处理需要快速判断元素是否存在的情况。的底层实现是哈希表,因此它提供了高效的查找、插入和删除操作。:当哈希表的负载因子(元素数量与桶数量的比值)超过一定阈值时,中的元素存储顺序是无序的,与插入顺序无关。中的元素是唯一的,不允许重复。

2501_92566074的博客 1307

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

力扣 Hot 100 刷题记录 - 随机链表的复制

是力扣 Hot 100 中的一道经典题目,题目要求如下:给你一个长度为n的链表,每个节点包含一个额外增加的随机指针random,该指针可以指向链表中的任何节点或空节点。构造这个链表的。深拷贝应该正好由n个全新节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的next指针和random指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。。输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]

weixin_50893711的博客 496

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

力扣LeetCode刷题C++ 两数之和 两数相加

这段代码的核心是 “逐步构建链表”:从无到有创建头节点,之后每计算出一位结果,就往链表末尾加一个新节点,同时让指针p始终保持在末尾,为下一次追加做准备。这样就能把所有计算结果串联成一个完整的链表。

weixin_73793168的博客 1090

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LeetCode—160.相交链表(Intersection of Two Linked Lists)——分析及代码(C++、Java)

LeetCode—160.相交链表[Intersection of Two Linked Lists]——分析及代码[C++] 一、题目 二、分析及代码 1. 双指针法 (1)思路 (2)代码 (3)结果 2. 哈希表 (1)思路 (2)代码 (3)结果 三、其他 一、题目 编写一个程序,找到两个单链表相交的起始节点。 如下面的两个链表: 在这里插入图片描述 在节点 c1 开始相交。 示例 1: 在这里插入图片描述 输入:intersectVal = 8, listA = [4,1,8,4,5],

江南土豆的博客 234

力扣141. 环形链表(哈希表、链表、双指针)C++

指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。来表示链表尾连接到链表中的位置(索引从 0 开始)。如果链表中有某个节点,可以通过连续跟踪。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。仅仅是为了标识链表的实际情况。,判断链表中是否有环。给你一个链表的头节点。

2301_80345285的博客 311

力扣 817. 链表组件 链表+哈希

https://leetcode-cn.com/problems/linked-list-components/ 思路:哈希一下GGG中出现的值,然后遍历链表判断就行了。 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solu

xiji333的博客 234

leetcode 160.相交链表

leetcode 160.相交链表 题目描述: 编写一个程序,找到两个单链表相交的起始节点。 如下面的两个链表: 在节点 c1 开始相交。 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3 输出:Reference of the node with value ...

EngineerHe的博客 1659

Leetcode 382. 链表随机节点 C++

Leetcode 382. 链表随机节点 题目 给定一个单链表,随机选择链表的一个节点,并返回相应的节点值。保证每个节点被选的概率一样。 示例: // 初始化一个单链表 [1,2,3]. ListNode head = new ListNode(1); head.next = new ListNode(2); head.next.next = new ListNode(3); Solution solution = new Solution(head); // getRandom()方法应随机返回1,2,

weixin_43750513的博客 240

【Hot 100 刷题计划】 LeetCode 142. 环形链表 II | C++ 哈希表直觉解法

文章摘要 LeetCode 142题要求找出链表中环的起始节点。提供两种解法:哈希表法和快慢指针法。哈希表法通过记录访问节点来检测环入口,时间复杂度O(n),空间复杂度O(n)。快慢指针法更高效,通过数学推导分两阶段解决:先判断是否有环,再推导出环入口位置,时间复杂度O(n),空间复杂度O(1)。后者是更优解,体现了算法与数学的巧妙结合。

qq_51233453的博客 209

【Hot 100 刷题计划】 LeetCode 141. 环形链表 | C++ 哈希表直觉解法

摘要:本文介绍了LeetCode 141题环形链表的两种解法。哈希表法通过记录访问过的节点判断是否有环,空间复杂度O(n)。更优的快慢指针法(龟兔赛跑)使用两个指针,快指针每次走两步,慢指针每次走一步,若相遇则说明有环,空间复杂度O(1)。后者无需额外空间,是更高效的解决方案。两种方法的时间复杂度均为O(n),但快慢指针法在空间上更优。

qq_51233453的博客 299

Leetcode hot 100 5.相交链表

请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回。是集合的方法,用于检查某个元素是否存在于集合中。我发现hot 都要用哈希表啊?,函数返回结果后,链表必须。整个链式结构中不存在环。:如果元素不存在于集合中。给你两个单链表的头节点。:如果元素存在于集合中。

Kimsanmyeong的博客 384

LeetCode第141题_环形链表

给你一个链表的头节点head,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从 0 开始)。pos。仅仅是为了标识链表的实际情况。如果链表中存在环,则返回true。否则,返回false。

qq_40263592的博客 2386

【Leetcode C++】2_5. [code] 环形链表Ⅰ、Ⅱ

5. [code] 环形链表Ⅰ、Ⅱ 5.1. 题目 Leetcode 141 给定一个链表,判断链表中是否有环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 示例1: 输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。 ...

SharonXuran 251
上一篇: 链表算法分享 | PART ONE (CPP+LeetCode)
下一篇: 字符串算法 | CPP + LeetCode
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值