算法面试真题详解:数组划分

简介: 算法面试真题详解:数组划分

描述
给出一个整数数组 nums 和一个整数 k。划分数组(即移动数组 nums 中的元素),使得:

  • 所有小于k的元素移到左边
  • 所有大于等于k的元素移到右边
    返回数组划分的位置,即数组中第一个位置 i,满足 nums[i] 大于等于 k。

在线评测地址:领扣题库官网

样例1

输入:
[],9
输出:
0

样例2

输入:
[3,2,2,1],2
输出:1

解释:
真实的数组为[1,2,2,3].所以返回 1

算法:快速选择算法

算法思路

  • 通过头尾指针跳过小于k的前缀和大于等于k的后缀,可以找到与第一个大于等于k的值和最后一个小于k的值。进行交换后可达到划分数组的目的,直到找到两个指针相遇为止。
  • 伪代码如下:
  • 令left = 0,right = length-1。
  • 当nums[left] < k时,left指针向右移动。
  • 当nums[right] >= k时,right指针向左移动。
  • 如果left <= right,交换两个值。
  • 如果left > right,返回left作为最终结果,否则返回第二步。
    复杂度分析
  • 设数组长度为n
  • 时间复杂度O(n)
  • 最多扫描一遍数组,时间复杂度为O(n)
  • 空间复杂度O(1)
  • 只需要选择用的游标变量的额外空间,所以空间复杂度为O(1)

    public class Solution {
    /**
     * @param nums: The integer array you should partition
     * @param k: An integer
     * @return: The index after partition
     */
    public int partitionArray(int[] nums, int k) {
        if (nums == null) {
            return 0;
        }
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            while (left <= right && nums[left] < k) {
                left++;
            }
            while (left <= right && nums[right] >= k) {
                right--;
            }
    
            if (left <= right) {
                int temp = nums[left];
                nums[left] = nums[right];
                nums[right] = temp;
    
                left++;
                right--;
            }
        }
        return left;
    }
    }

    更多题解参考:九章官网solution

相关文章
|
1月前
|
存储 算法 编译器
米哈游面试算法题:有效的括号
米哈游面试算法题:有效的括号
27 0
|
1月前
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
42 0
|
4天前
|
存储 算法 Java
数据结构与算法 数组和链表
数据结构与算法 数组和链表
10 0
|
8天前
|
存储 算法
Leetcode 30天高效刷数据结构和算法 Day1 两数之和 —— 无序数组
给定一个无序整数数组和目标值,找出数组中和为目标值的两个数的下标。要求不重复且可按任意顺序返回。示例:输入nums = [2,7,11,15], target = 9,输出[0,1]。暴力解法时间复杂度O(n²),优化解法利用哈希表实现,时间复杂度O(n)。
19 0
|
14天前
|
存储 缓存 算法
面试遇到算法题:实现LRU缓存
V哥的这个实现的关键在于维护一个双向链表,它可以帮助我们快速地访问、更新和删除最近最少使用的节点,同时使用哈希表来提供快速的查找能力。这样,我们就可以在 O(1) 的时间复杂度内完成所有的缓存操作。哈哈干净利索,回答完毕。
|
27天前
|
算法 搜索推荐 Python
数据结构与算法在Python面试中的应用实例
【4月更文挑战第13天】本文聚焦Python面试中的数据结构与算法问题,包括排序算法、链表操作和树图遍历。重点讨论了快速排序、链表反转和二叉树前序遍历的实现,并指出理解算法原理、处理边界条件及递归操作是避免错误的关键。通过实例代码和技巧分享,帮助面试者提升面试表现。
13 0
|
27天前
|
算法 JavaScript 前端开发
贪心算法】按要求补齐数组
贪心算法】按要求补齐数组
9 0
|
28天前
|
设计模式 算法 Java
如何在面试中应对编程与算法面试?
面试中,编程能力至关重要,主要分为三个层次:初级关注基本功,如语法、原理和常见问题解决;高级涉及数据结构与算法,基础算法如排序对中小厂重要,大厂则需深入数据结构;资深专家层次需精通设计模式,以保证代码的扩展性和维护性。提升编程技能可采用PDCA循环学习法,从计划到执行、检查、行动不断迭代。通过实践项目如开发后端系统、测试框架来检验学习成果,并逐步学习算法和设计模式。坚持不懈的努力和重构将助你成为技术专家。记住,超越大多数人的关键在于持续学习和专注深耕。
7 0
如何在面试中应对编程与算法面试?
|
1月前
|
算法
算法系列--两个数组的dp问题(2)(下)
算法系列--两个数组的dp问题(2)(下)
20 0
|
1月前
|
算法
算法系列--两个数组的dp问题(2)(上)
算法系列--两个数组的dp问题(2)
16 0