阿里 C++面试,算法题没做出来,,,

ops/2024/10/18 1:25:08/

我本人是非科班学 C++ 后端和嵌入式的。在我面试的过程中,竟然得到了阿里​ C++ 研发工程师的面试机会。因为,阿里主要是用 Java 比较多,C++ 的岗位比较少​,所以感觉这个机会还是挺难得的。

阿里 C++ 研发工程师面试考了我一道类似于快速排序算法算法题,虽然我算法题又一次没做出来然后面试挂了。

题目描述:

题号:215

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

解题思路:

思路一:快排变体(快速选择)

快速选择算法,这是快速排序算法的一种变种。快速选择算法可以在平均情况下以O(n)的时间复杂度找到数组中的第k个最小(或最大)元素。

步骤如下:

  1. 选择一个基准元素:我们可以随机选择一个元素作为基准,或者选择数组的第一个、最后一个或中间的元素。

  2. 分区:根据基准元素对数组进行分区,使得所有小于基准的元素都在基准的左边,所有大于基准的元素都在基准的右边。

  3. 判断基准元素的位置:如果基准元素正好是第k个最大的元素(从0开始计数),则直接返回该元素。如果基准元素的位置大于k,则在基准的左边部分继续寻找;如果基准元素的位置小于k,则在基准的右边部分继续寻找,并调整k的值。

  4. 递归:在选定的部分中重复上述步骤,直到找到第k个最大的元素。

时间复杂度:O(N) 

空间复杂度:O(log N)

C++

// C++
class Solution {
public:int quickselect(vector<int> &nums, int l, int r, int k) {if (l == r)return nums[k];int partition = nums[l], i = l - 1, j = r + 1;while (i < j) {do i++; while (nums[i] < partition);do j--; while (nums[j] > partition);if (i < j)swap(nums[i], nums[j]);}if (k <= j)return quickselect(nums, l, j, k);else return quickselect(nums, j + 1, r, k);}
​int findKthLargest(vector<int> &nums, int k) {int n = nums.size();return quickselect(nums, 0, n - 1, n - k);}
};

go

// go
func findKthLargest(nums []int, k int) int {n := len(nums)return quickselect(nums, 0, n - 1, n - k)
}
​
func quickselect(nums []int, l, r, k int) int{if (l == r){return nums[k]}partition := nums[l]i := l - 1j := r + 1for (i < j) {for i++;nums[i]<partition;i++{}for j--;nums[j]>partition;j--{}if (i < j) {nums[i],nums[j]=nums[j],nums[i]}}if (k <= j){return quickselect(nums, l, j, k)}else{return quickselect(nums, j + 1, r, k)}
}


http://www.ppmy.cn/ops/126347.html

相关文章

android——自定义控件(不停变化的textview、开关switch、动画效果的打勾)

一、从开始数字到结束数字&#xff0c;不断变化 import android.animation.TypeEvaluator; import android.animation.ValueAnimator; import android.content.Context; import android.util.AttributeSet; import android.view.animation.AccelerateDecelerateInterpolator;i…

Linux之如何找回 root 密码?

1、启动系统&#xff0c;进入开界面&#xff0c;在界面中按“e"进入编辑界面 2、进入编辑界面&#xff0c;使用键盘上的上下键把光标往下移动&#xff0c;找到以”Linux16“开通内容所在的行数&#xff0c;在行的最后面输入&#xff1a;init/bin/sh 3、输入完成后&…

【Spring AI】Java实现类似langchain的第三方函数调用_原理与详细示例

Spring AI 介绍 &#xff1a;简化Java AI开发的统一接口解决方案 在过去&#xff0c;使用Java开发AI应用时面临的主要困境是没有统一且标准的封装库&#xff0c;导致开发者需要针对不同的AI服务提供商分别学习和对接各自的API&#xff0c;这增加了开发难度与迁移成本。而Sprin…

408算法题leetcode--第36天

96. 不同的二叉搜索树 题目地址&#xff1a;96. 不同的二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 题解思路&#xff1a;dp 时间复杂度&#xff1a;O(n^2) 空间复杂度&#xff1a;O(n) 代码: class Solution { public:int numTrees(int n) {// dp[]: i个节点的二…

JavaWeb Servlet--09深入:注册系统03--删除用户业务

删除用户业务 在显示用户的界面游两个超链接&#xff1a;修改和删除&#xff0c;这里将对删除进行业务实现&#xff1a; 思想&#xff1a;在页面展示信息&#xff0c;点击删除的超链接后&#xff0c;获取id&#xff0c;在controller层进行调用service的业务逻辑处理&#xff…

【Linux系统编程】环境基础开发工具使用

目录 1、Linux软件包管理器yum 1.1 什么是软件包 1.2 安装软件 1.3 查看软件包 1.4 卸载软件 2、Linux编辑器-vim 2.1 vim的概念 2.2 vim的基本操作 2.3 vim的配置 3、Linux编译器-gcc/g 3.1 gcc编译的过程​编辑​编辑​编辑 3.2 详解链接 动态链接 静态链接 4…

oracle + mybatis 批量新增

oracle mybatis 批量新增 mybatis 批量最大1000条&#xff0c;数据多的话&#xff0c;分多次执行批量操作&#xff1a; <dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.4&l…

手机通过carlink投屏到车机,播放QQ音乐卡顿问题分析

1. 背景 相信开车的朋友&#xff0c;都会使用carlink或者carplay功能&#xff0c;实现手机投屏到车机&#xff0c;用来导航或者播放音乐等&#xff0c;可能吐槽过这个投屏功能为什么会那么卡&#xff0c;那么卡。。。 Carlife 和 CarPlay 都是车载系统&#xff0c;旨在将智能…