腾讯精选50题—Day5题目23,26,33

腾讯精选50题—Day5题目23,26,33

送你一朵小红花~希望自己乐观而坚强,自信而勇敢~

目录

腾讯精选50题—Day5题目23,26,33

1. 题目23 合并k个有序链表

(1)题目描述 困难

(2)思路

(3)题解

2. 题目26 空间复杂度删除有序数组的重复元素

(1)题目描述

(2)思路

(3)题解

扫描二维码关注公众号,回复: 13201321 查看本文章

3. 题目33 旋转有序数组的查找

(1)题目描述

(2)思路

(3)题解


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;
            }
    }
};

结果:

时间复杂度:O(k^{2}n)  待优化!!!

空间复杂度: O(1)

2. 题目26 空间复杂度O(1)删除有序数组的重复元素

(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;

	}
};

结果:

时间复杂度:O(n)

空间复杂度:O(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;
    }
};

结果:

时间复杂度:O(log n)

空间复杂度:O(1)

猜你喜欢

转载自blog.csdn.net/Fox_Alex/article/details/112724132
今日推荐