(每周10题)之 leetcode题目 ---(01~03)

开始记录立扣中的题目与想法,希望能给你一些启发与想法。

第一题: 两数之和

 解题思路:

      通常情况下我们会使用暴力破解法,就是传统的遍历,同过遍历找到目标值,此方法的时间复杂度为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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值