【Leetcode:977. 有序数组的平方 + 有序 + 双指针】

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,优快云-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述
在这里插入图片描述

🚩 题目链接

⛲ 题目描述

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1:

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
示例 2:

输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]

提示:

1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 已按 非递减顺序 排序

进阶:

请你设计时间复杂度为 O(n) 的算法解决本问题

🌟 求解思路&实现代码&运行结果


⚡ 有序 + 双指针

🥦 求解思路
  1. 给定的数组是升序排列,我们想要通过时间复杂度为 O(n) 的算法来返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
  2. 通过俩个双指针,分别指向数组的开始和结束位置,同时开辟一个同等大小的数组,从大到小开始填充元素,具体算法如下:
    • 初始化一个同等大小的数组
    • 循环开始
    • 初始化左指针left = 0,右指针 right = n - 1,填充位置index = n - 1
    • 循环结束条件,left <= right
    • 如果当前left元素的平方 < right指针元素的平方,填充index位置的元素为left元素的平方,left++;反之,填充为right元素的平方,right–
    • 每次index–。
    • 循环结束,最终返回数组
  3. 注意,为什么是从右开始向左填充呢,返回来可以吗?不可以,因为从右向左可以保证最大的元素,从左向右保证不了最小的元素。
  4. 有了基本的思路,接下来我们就来通过代码来实现一下的解法。
🥦 实现代码
class Solution {
    public int[] sortedSquares(int[] nums) {
        int n = nums.length;
        int[] ans = new int[n];
        for (int i = 0, j = n - 1, index = n - 1; i <= j;) {
            if (nums[i] * nums[i] >= nums[j] * nums[j]) {
                ans[index] = nums[i] * nums[i];
                i++;
            } else {
                ans[index] = nums[j] * nums[j];
                j--;
            }
            index--;
        }
        return ans;
    }
}
🥦 运行结果

在这里插入图片描述


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

<think> 我们正在讨论Linux内核PCI子系统中的函数。根据用户的新问题,他想了解`pci_bus_insert_busn_res`的作用和相关介绍。注意,函数名可能是`pci_bus_insert_busn_res`(而不是"bun_res",可能是拼写错误,因为PCI中有bus number资源的概念)。 由于没有直接提供引用内容,我将基于内核开发知识进行解释。请注意,以下内容基于Linux内核(特别是PCI子系统)的一般实现原理,具体版本可能略有差异。 首先,我们需要理解PCI总线号资源管理背景: - PCI总线拓扑结构中,每条总线都有一个唯一的编号(bus number)。在枚举PCI设备时,系统需要为每条总线分配总线号,并记录这些总线号的范围(即资源)。 - 内核使用`struct resource`来表示资源(如I/O端口、内存区域以及总线号等)。对于总线号资源,通常用`resource`结构表示一个范围(如0到255)。 `pci_bus_insert_busn_res`函数的作用: 1. **功能**:该函数用于将一个总线号资源(bus number resource)插入到指定PCI总线的资源列表中。这样,该总线的子总线就可以从这个资源中分配总线号。 2. **参数**:函数原型通常为: ```c int pci_bus_insert_busn_res(struct pci_bus *bus, int bus_min, int bus_max) ``` 其中: - `bus`:目标PCI总线(要插入资源的那个总线)。 - `bus_min`:总线号资源的最小值(起始总线号)。 - `bus_max`:总线号资源的最大值(结束总线号)。 3. **操作**: - 函数内部会创建一个新的`struct resource`对象,并将其`start`设为`bus_min`,`end`设为`bus_max`,并将该资源添到总线的资源列表中(通常是`bus->resource[]`数组的`PCI_BUS_NUM_RESOURCES`位置,因为总线号资源是单独管理的)。 - 这个资源表示该总线可以分配给其下挂载的子总线(或设备)的总线号范围。 4. **使用场景**: - 在PCI总线枚举过程中,当发现一个新的总线(比如在配置桥设备时),需要为其分配总线号范围。此时,就会调用此函数来设置该总线的总线号资源。 - 例如,在`pci_scan_bridge`函数(用于扫描PCI桥)中,当确定桥下游总线的总线号范围后,就会调用`pci_bus_insert_busn_res`来插入该资源。 5. **关联函数**: - `pci_bus_update_busn_res_end`:更新总线号资源的结束值(当发现需要扩展总线号范围时)。 - `pci_bus_remove_busn_res`:移除之前插入的总线号资源(在错误处理或总线移除时)。 6. **错误处理**:如果资源插入失败(比如内存不足),函数会返回错误码(负值)。 总结:`pci_bus_insert_busn_res`是Linux内核PCI子系统中的一个辅助函数,用于管理PCI总线号资源。它在PCI总线枚举过程中被调用,为指定的PCI总线设置总线号资源范围,以便后续为子总线分配总线号。 注意:由于内核版本变化,函数名或行为可能略有调整,但基本原理一致。 §§相关问题§§ 1. PCI总线枚举过程是怎样的? 2. 在Linux内核中,PCI桥设备是如何处理的? 3. `struct resource`在内核中如何表示不同类型的资源? </think> ### `pci_bus_insert_busn_res` 的作用功能详解 在 Linux 内核的 PCI 子系统中,`pci_bus_insert_busn_res` 是一个关键函数,用于管理 PCI 总线号资源(Bus Number Resources)。以下基于内核实现原理进行解析(注:函数名中的 `bun` 可能是笔误,标准名称应为 `busn`,即 Bus Number 的缩写): --- #### 1. **核心作用** 该函数主要用于: - **注册总线号资源范围** 当扫描 PCI 总线的层次结构时(如 PCI 桥设备),系统需要为每个总线分配唯一的总线号范围(例如 `0-255`)。 ``` pci_bus_insert_busn_res(bus, min_busn, max_busn); ``` 将总线 `bus` 的总线号范围 `[min_busn, max_busn]` 插入内核资源管理系统。 - **资源冲突检测** 防止不同总线使用重叠的总线号范围,确保 PCI 拓扑结构的正确性[^1]。 - **支持动态扩展** 在热插拔或 PCIe 设备枚举过程中,动态调整总线号资源边界(如扩展 `max_busn`)。 --- #### 2. **工作原理** 其内部流程如下: 1. **创建资源对象** 初始化一个 `struct resource` 对象,类型为 `IORESOURCE_BUS`: ```c struct resource { resource_size_t start; // min_busn resource_size_t end; // max_busn unsigned long flags; // IORESOURCE_BUS }; ``` 2. **插入资源树** 将此资源添到总线所属的层级资源树中: ```c if (bus->busn_res) return -EINVAL; // 避免重复注册 bus->busn_res = &busn_res; // 关联到 pci_bus 结构 ``` 3. **冲突检查** 通过 `request_resource()` 检测其他总线号的冲突(如父总线的资源范围)[^2]。 --- #### 3. **调用场景** 该函数在以下过程中被调用: - **PCI 桥初始化** 在 `pci_scan_bridge()` 中分配下游总线号时: ```c pci_bus_insert_busn_res(child_bus, bus_min, bus_max); ``` - **热插拔事件处理** 动态添 PCIe 设备时扩展总线号资源范围。 - **ACPI 固件解析** 解析 `_CRS` 或 `_PRT` 方法描述的总线号资源。 --- #### 4. **关联函数** - `pci_bus_update_busn_res_end()` 动态扩展总线号上限(如发现新设备需要更大范围)。 - `pci_bus_remove_busn_res()` 移除总线号资源(总线卸载时)。 - `pci_bus_resource_n()` 获取总线的第 `n` 个资源(总线号资源索引为 `PCI_BUS_NUM_RESOURCES-1`)[^3]。 --- #### 5. **实际意义** - **拓扑结构维护** 确保多级 PCI 总线(如服务器复杂拓扑)的总线号全局唯一。 - **资源隔离** 防止虚拟机(VM)或容器间 PCI 设备的总线号冲突。 - **错误恢复** 总线枚举失败时,通过移除资源避免内核崩溃。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硕风和炜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值