腾讯精选50题—Day14题目 215,217,230

腾讯精选50题—Day14题目 215,217,230

  第十四天~

1. 题目 215 寻找第K大的数 经典面试题

(1) 题目描述

在这里插入图片描述

(2) 思路

   利用快排中的partition+双指针。

(3) 题解

class Solution {
    
    
private:
    int partition(vector<int>& nums, int left, int right) {
    
    
        // 随机在 [left, right] 中, 选择一个数值作为标定点 pivot
        swap(nums[left], nums[rand() % (right - left + 1) + left]);

        int pivot = nums[left];
        while (left < right) {
    
    
            while (left < right & nums[right] >= pivot) {
    
    
                right--;
            }
            nums[left] = nums[right];
            while (left < right & nums[left] < pivot) {
    
    
                left++;
            }
            nums[right] = nums[left];
        }
        nums[left] = pivot;
        return left;
    }

public:
    int findKthLargest(vector<int>& nums, int k) {
    
    
        int size = nums.size();
        int target = size - k;

        int left = 0;
        int right = size - 1;
        while (true) {
    
    
            int p = partition(nums, left, right);
            if (p == target) {
    
    
                return nums[p];
            }
            else if (target < p) {
    
    
                right = p - 1;
            }
            else {
    
    
                left = p + 1;
            }
        }
    }
};

结果:
在这里插入图片描述
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

2. 题目 217 存在重复元素

(1) 题目描述

在这里插入图片描述

(2) 思路

  使用一个Hash表,当插入新元素到Hash表时,如果里面存在相同元素,那么返回False,否则,返回True。

(3) 题解

class Solution {
    
    
public:
    bool containsDuplicate(vector<int>& nums) {
    
    
        unordered_set<int> s;//hash

        for (int x : nums)
        {
    
    
            if (s.find(x) != s.end())
                return true;
            s.insert(x);
        }
        return false;
    }
};

结果:
在这里插入图片描述
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

3. 题目

(1) 题目描述

在这里插入图片描述

(2) 思路

  二叉排序树的特性就是中序遍历后得到的序列是有序的,所以我们对二叉排序树进行中序遍历,然后将第k个遍历到的数存储即可。

(3) 题解

递归解法:

class Solution {
    
    
public:
    TreeNode* result;

    int kthSmallest(TreeNode* root, int k) {
    
    

        Travel(root, k);
        return result->val;
    }

    void Travel(TreeNode* root, int &k)
    {
    
    
        if (root == NULL)
        {
    
    
            return;
        }
        Travel(root->left, k);
        k--;
        if (k == 0)
        {
    
    
            result = root;
            return;
        }
        Travel(root->right, k);
    }
};

结果:
在这里插入图片描述

时间复杂度: O ( n ) O(n) O(n) n为二叉树的结点数
空间复杂度: O ( 1 ) O(1) O(1)

参考

  1. 寻找第K大的数

おすすめ

転載: blog.csdn.net/Fox_Alex/article/details/113198138