开始记录立扣中的题目与想法,希望能给你一些启发与想法。
第一题: 两数之和
解题思路:
通常情况下我们会使用暴力破解法,就是传统的遍历,同过遍历找到目标值,此方法的时间复杂度为O(n^2) ,在这里会报时间错误,不能采用此方法,看目要求,是返回两个数据之和的下标。如果我们采用map的属性就轻松解决。
map是一个key,与value值,我们把 key保留为 target - nums[i] i为当前下标,value存储i ,在下次寻找的数判断是否是key,如果是就找到当前值,与key的i值。如果没有找到继续存储。这样最坏只要遍历一遍就可以找到 时间复杂度 O(n).
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> record;
for (int i = 0; i < nums.size(); i++)
{
if (record.count(nums[i])) //count 在map中是找到的功能, 只有 0和 1
{
return{ record[nums[i]],i };
}
record[target - nums[i]] = i;
}
return{ -1,-1 };
}
void testtwoSum()
{
vector<int> Nums = {2,7,11,15};
int target = 9;
for (auto & i: Nums)
{
cout << i << " ";
}
cout << endl;
vector<int> result = twoSum(Nums, target);
//输出结果
cout << "first : " << result[0] << " second : " << result[1] << endl;
}
输出结果:
结果:
2 7 11 15
first : 0 second : 1
题目想法,当为2个目标的时候,可以考虑map的性质。如果题目没有规定个数的时候呢,找到下标相加为目标的数的比如:
1 + 2 +4 +6 = 13;要求输出 1 2 4 6的下标呢,问题有很多的变化,不要总是记住答案,要会多思考。
第二题: 两数相加
解题思路:
这个题目你可以联想到进位问题,首先可以知道,是逆序,高位在后面,一个要记录商,一个要记录余数,当前节点存放余数,下个节点和要加上进位的商,一次下去,当一个链表没有了,就加上对应是数据。然后存储。时间复杂度O(max(m,n))。
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode vHead(0), *p = &vHead;
int flag = 0;
while (l1 || l2 || flag) {
int tmp = 0;
if (l1 != nullptr) tmp += l1->val;
if (l2 != nullptr) tmp += l2->val;
tmp += flag;
flag = tmp / 10;
tmp %= 10;
ListNode *next = l1 ? l1 : l2;
if (next == nullptr) next = new ListNode(tmp);
next->val = tmp;
p->next = next;
p = p->next;
l1 = l1 ? l1->next : nullptr;
l2 = l2 ? l2->next : nullptr;
}
return vHead.next;
}
虽然是中等难度的题目,但是没有那么麻烦,只要相当解决方案,变可以解决它。
第三题 :无重复字符的最长子串
解题思路:
滑块方式,abc 下个是a,变有重复了,然后以b为开始,从c后面开始找,就这样类推方式,时间复杂度(n^2)
int lengthOfLongestSubstring(string s) {
int start = 0, end = 0, length = 0, result = 0;
int size = s.size(); //获取字符串长度
vector<int> vec(128, -1);
while (end < size)
{
char temchar = s[end]; //获取最新的字符
//判断有没有重复的数据
if (vec[(int)temchar] >= start)
{
start = vec[(int)temchar] + 1;//获取当前字符的
length = end - start; //记录重复的记录长度
}
vec[(int)temchar] = end;
length++;
end++;
result = max(result, length);
}
return result;
}
void testlengthOfLongestSubstring()
{
string s = "abcabca";
int result = lengthOfLongestSubstring(s);
cout << result << endl;
}
结果:
3