Java C++题解leetcode915分割数组示例

 更新时间:2022年11月02日 17:12:45   作者:AnjaVon  
这篇文章主要为大家介绍了Java C++题解leetcode915分割数组示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

题目要求

题目链接

思路一:两次遍历

题目的意思也就是左半边数组的最大值小于等于右半边数组的最小值,那么就找这个分界点就好;

  • 首先从后向前遍历,找[i,n−1]里最小的值;
  • 然后从前向后遍历,找[0,i]里最大的值;
  • 然后找满足max[i]<=min[i+1]的分割点i;
  • 可以将2、3两步结合为一步完成,由于iii从前向后不断增大,所以用后面(较大)的值覆盖更新之前的值。

找到分界点的索引后,只需+1即可得到长度。

Java

class Solution {
    public int partitionDisjoint(int[] nums) {
        int n = nums.length;
        int[] minn = new int[n + 10];
        minn[n - 1] = nums[n - 1];
        for (int i = n - 2; i >= 0; i--)
            minn[i] = Math.min(minn[i + 1], nums[i]);
        for (int i = 0, maxx = 0; i < n - 1; i++) {
            maxx = Math.max(maxx, nums[i]);
            if (maxx <= minn[i + 1])
                return i + 1;
        }
        return 1; // 用例保证不出现
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

C++

class Solution {
public:
    int partitionDisjoint(vector<int>& nums) {
        int n = nums.size();
        int minn[n + 10];
        minn[n - 1] = nums[n - 1];
        for (int i = n - 2; i >= 0; i--)
            minn[i] = min(minn[i + 1], nums[i]);
        for (int i = 0, maxx = 0; i < n - 1; i++) {
            maxx = max(maxx, nums[i]);
            if (maxx <= minn[i + 1])
                return i + 1;
        }
        return 1; // 用例保证不出现
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

Rust

impl Solution {
    pub fn partition_disjoint(nums: Vec<i32>) -> i32 {
        let n = nums.len();
        let mut minn = vec![nums[n - 1]; n + 10];
        for i in (0..(n - 1)).rev() {
            minn[i] = minn[i + 1].min(nums[i]);
        }
        let mut maxx = 0;
        for i in 0..(n - 1) {
            maxx = maxx.max(nums[i]);
            if (maxx <= minn[i + 1]) {
                return (i + 1) as i32;
            }
        }
        return 1; // 用例保证不出现
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

思路二:一次遍历

从前向后遍历每个节点,依次假设每个节点为最终分界点;

  • 维护当前遍历节点的最大值maxx,即[0,i]内;
  • 记录假设分界点i及其对应左半边数组最大值leftMax;

若当前值nums[i]<leftMax则重新划定分界,将当前节点纳入左区间;

找到最终结果节点索引值,将其+1即得答案。

Java

class Solution {
    public int partitionDisjoint(int[] nums) {
        int leftMax = nums[0], res = 0, maxx = nums[0];
        for (int i = 1; i < nums.length - 1; i++) {
            maxx = Math.max(maxx, nums[i]);
            if (nums[i] < leftMax) {
                leftMax = maxx;
                res = i;
            }
        }
        return res + 1;
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

C++

class Solution {
public:
    int partitionDisjoint(vector<int>& nums) {
        int leftMax = nums[0], res = 0, maxx = nums[0];
        for (int i = 1; i < nums.size() - 1; i++) {
            maxx = max(maxx, nums[i]);
            if (nums[i] < leftMax) {
                leftMax = maxx;
                res = i;
            }
        }
        return res + 1;
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

Rust

impl Solution {
    pub fn partition_disjoint(nums: Vec<i32>) -> i32 {
        let (mut leftMax, mut res, mut maxx) = (nums[0], 0, nums[0]);
        for i in 1..(nums.len()-1) {
            maxx = maxx.max(nums[i]);
            if nums[i] < leftMax {
                leftMax = maxx;
                res = i as i32;
            }
        }
        res + 1
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

以上就是Java C++题解leetcode915分割数组示例的详细内容,更多关于Java C++题解分割数组的资料请关注脚本之家其它相关文章!

相关文章

  • C语言编一个数字益智小游戏

    C语言编一个数字益智小游戏

    这篇文章主要介绍了C语言编一个数字益智小游戏,本文通过实例截图的形式给大家展示的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • C语言函数栈帧详解

    C语言函数栈帧详解

    下面小编就为大家带来一篇浅谈C语言函数调用参数压栈的相关问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-10-10
  • VC++获得当前进程运行目录的方法

    VC++获得当前进程运行目录的方法

    这篇文章主要介绍了VC++获得当前进程运行目录的方法,可通过系统函数实现该功能,是非常实用的技巧,需要的朋友可以参考下
    2014-10-10
  • C语言字符串函数,字符函数,内存函数使用及模拟实现

    C语言字符串函数,字符函数,内存函数使用及模拟实现

    这篇文章主要介绍了C语言字符串函数,字符函数,内存函数使用及模拟实现,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 基于C语言实现的aes256加密算法示例

    基于C语言实现的aes256加密算法示例

    这篇文章主要介绍了基于C语言实现的aes256加密算法,结合具体实例形式详细分析了C语言实现的aes256加密算法实现步骤与使用技巧,需要的朋友可以参考下
    2017-02-02
  • C++轻量级界面开发框架ImGUI介绍小结

    C++轻量级界面开发框架ImGUI介绍小结

    如果从事过C++ Windows客户端开发,大家对MFC、Qt、DuiLib等各种DirectUI应该有了解,本篇给大家介绍一个超级轻量级的C++开源跨平台图形界面框架ImGUI,感兴趣的可以了解一下
    2021-11-11
  • Qt实现密码显示按钮

    Qt实现密码显示按钮

    这篇文章主要为大家详细介绍了Qt实现密码显示按钮,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++替换栈中和.data中的cookie实现步骤详解

    C++替换栈中和.data中的cookie实现步骤详解

    这篇文章主要介绍了C++替换栈中和.data中的cookie实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • C++超详细分析单链表的实现与常见接口

    C++超详细分析单链表的实现与常见接口

    链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,本章带你分析单链表的实现与常见接口
    2022-03-03
  • C/C++中指针和引用之相关问题深入研究

    C/C++中指针和引用之相关问题深入研究

    从内存分配上看,程序为指针变量分配内存区域,而不为引用分配内存区域,因为引用声明时必须初始化,从而指向一个已经存在的对象。引用不能指向空值
    2013-10-10

最新评论