腾讯精选50题—Day5题目23,26,33
送你一朵小红花~希望自己乐观而坚强,自信而勇敢~
目录
1. 题目23 合并k个有序链表
(1)题目描述 困难
(2)思路
根据我的上一篇博客腾讯精选50题—第21题 合并两个有序链表,简单粗暴一个一个将待排序第i个链表和已经排好序的部分进行排序,这样时间复杂度会非常高,性能也会非常差,待优化。
(3)题解
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode* result = NULL;
for (int i = 0; i < lists.size(); i++)
{
result = mergeTwoLists(result, lists[i]);
}
return result;
}
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2)
{
if (list1 == NULL)
return list2;
if (list2 == NULL)
return list1;
if (list1->val <= list2->val)
{
list1->next = mergeTwoLists(list1->next, list2);
return list1;
}
else {
list2->next = mergeTwoLists(list1, list2->next);
return list2;
}
}
};
结果:
时间复杂度: 待优化!!!
空间复杂度:
2. 题目26 空间复杂度删除有序数组的重复元素
(1)题目描述
(2)思路
使用双指针法(快指针和慢指针),快指针用来访问元素,慢指针用来比较和元素存储。
(3)题解
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
//slow and quick pointer
int slow = 0;
int quick = 1;
int len = nums.size();
if (len < 1)
return 0;
while (quick < len)
{
if (nums[quick] != nums[slow])
{
nums[slow + 1] = nums[quick];
slow++;
}
quick++;
}
return slow+1;
}
};
结果:
时间复杂度:
空间复杂度:
3. 题目33 旋转有序数组的查找
(1)题目描述
(2)思路
还是不熟练啊...二分查找一个等号是真的要命...
(3)题解
class Solution {
public:
int search(vector<int>& nums, int target) {
int len = nums.size();
int mid = 0;
int low = 0;
int high = len - 1;
if (nums.size() == 0)
return -1;
while (low <= high)
{
mid = low + (high - low) / 2;
if (nums[mid] == target)
return mid;
else {
if (nums[low] <= nums[mid])
{
if (nums[low] <= target && nums[mid] > target)
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
else {
if (target <= nums[high] && target > nums[mid])
{
low = mid + 1;
}
else {
high = mid - 1;
}
}
}
}
return -1;
}
};
结果:
时间复杂度:
空间复杂度: