Task05——采用C++

第23题 合并K个升序链表

在这里插入图片描述
思路:

采用递归,由于之前已经做过两个链表的合并(可见上一个),所以K个链表其实就是两个链表的升级版,只需要让第二个以及以后的链表与第一个相组合,组合结果加入第一个链表,最后返回第一个链表就可以。

C++代码:

class Solution
{
    
    
public:
    ListNode *mergeTwoLists(ListNode *l1, ListNode *l2)
    {
    
    
        if (l1 == nullptr)
            return l2;
        if (l2 == nullptr)
            return l1;
        if (l1->val <= l2->val)
        {
    
    
            l1->next = mergeTwoLists(l1->next, l2);
            return l1;
        }
        if (l1->val > l2->val)
        {
    
    
            l2->next = mergeTwoLists(l1, l2->next);
            return l2;
        }
        return nullptr;
    }
    ListNode *mergeKLists(vector<ListNode *> &lists)
    {
    
    
        if(lists.empty()) return nullptr;
        ListNode *ans = lists[0];
        int n=lists.size();
        for (int i = 1; i < n; i++)
        {
    
    
            ans= mergeTwoLists(ans, lists[i]);
        }
        return ans;
    }
};

在这里插入图片描述

026 删除排序数组中的重复项

在这里插入图片描述

思路:

利用双指针,一个“快”指针,一个“慢”指针,遍历一遍数组,过程中,通过比较快指针与慢指针所对应的值比较,就可以得到去重的数组。应该可以在要求的O(1)内完成。

C++代码:

class Solution
{
    
    
public:
    int removeDuplicates(vector<int> &nums)
    {
    
    
        if (nums.size() < 2)
            return nums.size();
        int i = 0;
        for (int j = 0; j < nums.size(); j++)
        {
    
    
            if (nums[i] != nums[j])
            {
    
    
                i++;
                nums[i] = nums[j];

            }
        }
        return i+1;
    }
};

在这里插入图片描述

033 搜索旋转排序数组

在这里插入图片描述
思路:

每太看懂这个题,直接遍历一遍,复杂度O(n)。二分法可能是O(logN)。二分法可能是题目需要的吧。

二分法:顾名思义就是不断二分,缩小范围,最后找到所需要的值。我用递归写一下二分法吧。

int BinarySearch(vector<int> nums, int l, int r, int target) //l,r分别为左右边界,target为查找的值.
{
    
    
    if (l == r) //l==r是递归的出口
    {
    
    
        int ret = (nums[l] == target ? l : -1);
        return ret; //判断数组中是否存在target,存在则返回索引,不存在则返回-1.
    }
    int mid = (l + r) / 2;
    if (nums[l] < nums[mid]) //判断l~mid是否为递增序列
    {
    
    
        if (nums[l] <= target && nums[mid] >= target)  //判断target是否在l~mid之间
            return BinarySearch(nums, l, mid, target); //若在l~mid之间,让mid成为右端点。
        return BinarySearch(nums, mid + 1, r, target); //若不在l~mid之间,则一定在mid+1~r之间,则让mid+1成为左端点。
    }
    else //mid+1~right之间为递增序列
    {
    
    
        if (nums[mid + 1] <= target && nums[r] >= target)  //判断target是否在mid~r
            return BinarySearch(nums, mid + 1, r, target); //若在mid~r,让mid变成左端点。
        return BinarySearch(nums, l, mid, target);         //若在l~mid,mid变成右端点。
    }
}

本题代码C++:

class Solution
{
    
    
public:
    int BinarySerch(vector<int> &nums, int left, int right, int target)
    {
    
    
        if (left == right)
        {
    
    
            int ret=(target==nums[left]?left:-1);
            return ret;
        }
        int mid = (left + right) / 2;
        if (nums[left] < nums[mid])
        {
    
    
            if (nums[left] <= target && nums[mid] >= target)
                return BinarySerch(nums, left, mid, target);
            return BinarySerch(nums, mid + 1, right, target);
        }
        else
        {
    
    
            if (nums[mid + 1] <= target && nums[right] >= target)
                return BinarySerch(nums, mid + 1, right, target);
            return BinarySerch(nums, left, mid, target);
        }
    }
    int search(vector<int> &nums, int target)
    {
    
    
        if (nums.empty())  //注意!!这里一定要判断是否为空。
            return -1;
        return BinarySerch(nums, 0, nums.size() - 1, target);
    }
};

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_34811382/article/details/112723439