题目1/150:两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
解题
第一题仿佛英语单词的abandon,就当开个头,但因为用了太久的Qt,一些关键词竟也不是太熟悉,得快快的温故知新
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
//方法2:用另一个map存储value-index的对应关系
map<int, int> mapIndex;
vector<int> res;
for(int i = 0; i<nums.size(); i++)
{
int another = target- nums[i];
if(mapIndex.find(another) != mapIndex.end())
{
res = {i, mapIndex[another]};
break;
}
mapIndex[nums[i]] = i;
}
return res;
}
};
/*
find()用于在map中查找一个键,如果找到,则返回该键对应的值,如果没有,就返回map::end
count()用于统计map中是否出现某个键,返回1或者0
*/
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
//方法1 暴力两次遍历
vector<int> res;
for(int i = 0; i<nums.size(); i++)
{
int another = target - nums[i];
for(int j = i+1; j<nums.size(); j++)
{
if(nums[j] == another)
{
res.push_back(i);
res.push_back(j);
break;
}
}
}
return res;
}
};
题目2/150:两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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 *newhead = nullptr, *tail = nullptr;
int carry = 0;
while(l1 ||l2)
{
int n1 = l1 ? l1->val : 0;
int n2 = l2 ? l2->val : 0;
int sum = n1+n2+carry;
if(!newhead)
{
newhead = tail = new ListNode(sum%10);
}else
{
tail->next = new ListNode(sum%10);
tail = tail->next;
}
carry = sum/10;
if(l1)
{
l1 = l1->next;
}
if(l2)
{
l2 = l2->next;
}
}
if(carry > 0)
{
tail->next = new ListNode(carry);
}
return newhead;
}
};
题目3/150:无重复字符的最长字串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
题解
第一眼没有思路 浅看题解瞥到”滑动窗口“,
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_set<char> occ;
int n = s.size();
int rk = -1, ans = 0;
for(int i = 0; i<n; i++)
{
if(i != 0)
{
occ.erase(s[i-1]);
}
while(rk+1 <n && !occ.count(s[rk +1]))
{
occ.insert(s[rk+1]);
++rk;
}
//直到需要重新左指针右移 即下一个字串
ans = max(ans, rk-i+1);
}
return ans;
}
};
/*
假设我们选择字符串中第K个字符作为起始位置,并且得到了不包含重复字符的最长字串的结束位置为rk
那么当我们选择第K+1个字符作为起始位置时,首先从K+1到rk的字符显然是不重复的,但由于少了原本的第K个字符
我们可以尝试继续增大rk,直到右侧出现了重复字符为止
左右指针:
左指针右移,表示我们开始枚举下一个字符作为起始位置,不断右移右指针,保证中间子串没有重复字符。
需要多一个函数用来表示当前字串是否包含重复字符
=====> 哈希集合:采用哈希表实现,哈希集合中的元素是唯一的,通常用于存储不重复的元素集,以及在数据集中执行查找操作
哈希集合查找、插入、删除的时间复杂度都为O(1)
*/