刷leetcode记录:数组下标与间距问题及链表相加解法

需积分: 12 0 下载量 132 浏览量 更新于2024-11-20 收藏 9KB ZIP 举报
资源摘要信息:"LeetCode数组下标大于间距问题解析与代码实现" 在IT行业,算法和数据结构是程序员必须掌握的基础知识之一。LeetCode是一个著名的在线编程平台,它提供了大量的编程题目供程序员练习,帮助他们提升算法能力,为技术面试做准备。在这些题目中,"数组下标大于间距"是一个涉及到算法和编程技巧的问题。本资源将详细解读LeetCode中的相关题目以及用C++语言实现的代码解析。 ***o Sum问题解析: Two Sum问题要求在给定的整数数组nums中找出两个数,使得它们的和为一个特定的目标值target。最简单的解决方案是使用哈希表来记录已经遍历过的元素与它们的索引,这样可以在O(1)的时间内检查是否存在一个数已经遍历过,并且满足与目标值的差值要求。 C++代码实现: ```cpp vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int, int> m; for (int i = 0; i < nums.size(); ++i) { auto it = m.find(target - nums[i]); if (it != m.end()) { return { it->second, i }; } m[nums[i]] = i; } return {}; } ``` 在这段代码中,我们首先创建了一个unordered_map来存储每个元素和它的索引。然后,我们遍历数组nums,每次遍历时我们查看是否存在一个target - nums[i]的值在map中。如果存在,则返回这对索引。如果不存在,我们将当前元素和它的索引存入map。 2. Add Two Numbers问题解析: Add Two Numbers问题要求实现一个函数来将两个非负整数的链表相加。每个链表中的节点包含一个数字,且这些数字是逆序存储的。在实现时,我们需要逐位计算两个数的和以及进位,并将结果存储在一个新的链表中。 C++代码实现: ```cpp ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode dummy(0); ListNode* p = &dummy; int carry = 0; while (l1 || l2 || carry) { int sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) + carry; p->next = new ListNode(sum % 10); carry = sum / 10; l1 = l1 ? l1->next : nullptr; l2 = l2 ? l2->next : nullptr; p = p->next; } return dummy.next; } ``` 在这段代码中,我们首先创建了一个虚拟头节点dummy来简化边界条件处理。然后,我们使用一个循环来遍历两个链表,直到两个链表都没有节点并且进位为0。在每次迭代中,我们计算当前位上的和以及新的进位。创建一个新节点,将其值设置为当前位的和模10,并将它链接到结果链表中。 3. Longest Substring Without Repeating Characters问题解析: Longest Substring Without Repeating Characters问题要求找出一个字符串中不含重复字符的最长子串的长度。这个问题可以通过滑动窗口算法来解决。滑动窗口是一个常用的算法模式,用于处理涉及子数组或子字符串的问题。 C++代码实现: ```cpp int lengthOfLongestSubstring(string s) { int n = s.length(), ans = 0; vector<int> map(256, -1); int start = -1; for (int i = 0; i < n; ++i) { start = max(map[s[i]], start); ans = max(ans, i - start); map[s[i]] = i; } return ans; } ``` 在这段代码中,我们使用一个大小为256的数组来存储字符的最新出现位置,初始值设为-1。我们使用一个变量start来跟踪当前有效子串的起始位置。当遇到重复字符时,我们更新start到重复字符上一次出现位置的下一个位置。然后我们更新当前有效子串的长度,并更新哈希表中字符的最新位置。 这些题目的代码都是用C++实现的,C++语言因其高性能和丰富的库支持,成为解决算法问题的常见选择之一。通过解决这些问题,程序员可以提高自己处理复杂数据结构和算法的能力,为实际工作中的技术挑战做好准备。在准备面试时,LeetCode等平台上的练习题可以帮助求职者在面试中展示自己的编程技巧和解题思路。