【二分查找】——旋转排序数组

153. 寻找旋转排序数组中的最小值

一、问题描述

已知一个长度为n的数组,预先按照升序排列,经由 1 到n次旋转后,得到输入数组。例如,原数组nums = [0,1,2,4,5,6,7]在变化后可能得到:若旋转 4 次,则可以得到[4,5,6,7,0,1,2];若旋转 7 次,则可以得到[0,1,2,4,5,6,7]。注意,数组[a[0], a[1], a[2],..., a[n - 1]]旋转一次的结果为数组[a[n - 1], a[0], a[1], a[2],..., a[n - 2]]

现在给你一个元素值互不相同的数组nums,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。要求找出并返回数组中的最小元素。必须设计一个时间复杂度为O(log n)的算法解决此问题。

二、示例说明

  1. 输入:nums = [3,4,5,1,2],输出:1
    • 原数组为[1,2,3,4,5],旋转 3 次得到输入数组,最小元素为1
  2. 输入:nums = [4,5,6,7,0,1,2],输出:0
    • 原数组为[0,1,2,4,5,6,7],旋转 3 次得到输入数组,最小元素为0
  3. 输入:nums = [11,13,15,17],输出:11
    • 原数组为[11,13,15,17],旋转 4 次得到输入数组,最小元素为11

三、提示信息

  1. n == nums.length:数组的长度。
  2. 1 <= n <= 5000:数组长度的范围。
  3. -5000 <= nums[i] <= 5000:数组中元素的取值范围。
  4. nums中的所有整数互不相同。
  5. nums原来是一个升序排序的数组,并进行了 1 至n次旋转。

四、解题思路

  1. 由于要求时间复杂度为O(log n),可以考虑使用二分查找。
  2. 数组经过旋转后被分为两个有序的部分,最小元素是两个有序部分的分界线。
  3. 通过比较中间元素与右边界元素的大小关系,可以确定最小元素在哪个部分。
  4. 如果中间元素大于右边界元素,说明最小元素在右半部分;否则,说明最小元素在左半部分或者就是中间元素。

五、代码实现

  1. 如果中间元素大于最右元素,说明旋转后的数组的最小值一定在右半边(且一定不为中间元素),移动左边界 l e f t left left m i d + 1 mid + 1 mid+1
  2. 否则中间元素小于最右元素(题目要求输入数组不重复,所以不可能等于),说明最小值在左半边或者就是 m i d mid mid,所以移动右边界 r i g h t right right m i d mid mid
  3. 不断重复以上判断,直到退出循环,输出此时的 r i g h t right right 就是最小值!
class Solution:
    def findMin(self, nums: List[int]) -> int:
        left, right = 0, len(nums) - 1
        while left < right:
            mid = left + (right - left)//2
            if nums[mid] > nums[right]:
                left = mid + 1
            else:
                right = mid
        return right
  1. 错错错,right是最小值所在位置,nums[right]才是题目要求输出的最小值!必须注意,不然考试的时候紧张写不出!

以下是使用 Python 实现的代码:

class Solution:
    def findMin(self, nums: List[int]) -> int:
        left, right = 0, len(nums) - 1
        while left < right:
            mid = left + (right - left)//2
            if nums[mid] > nums[right]:
                left = mid + 1
            else:
                right = mid
        return nums[right]

33. 搜索旋转排序数组

难度升级,不找最小值了!找特定值target,

一、问题描述

整数数组 nums升序排列,数组中的值互不相同。在预先未知的某个下标 k0 <= k < nums.length)上进行了旋转,使数组变为 [nums[k], nums[k + 1],..., nums[n - 1], nums[0], nums[1],..., nums[k - 1]](下标从 0 开始计数)。

现在给定旋转后的数组 nums 和一个整数 target,如果 nums 中存在这个目标值 target,则返回它的下标,否则返回 -1。必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

二、示例说明

  1. 输入:nums = [4,5,6,7,0,1,2]target = 0,输出:4
    • 在给定的旋转后的数组中,目标值0的下标是4
  2. 输入:nums = [4,5,6,7,0,1,2]target = 3,输出:-1
    • 目标值3不在给定的旋转后的数组中。
  3. 输入:nums = [1]target = 0,输出:-1
    • 数组中只有一个元素,且目标值不在其中。

三、提示信息

  1. 1 <= nums.length <= 5000:数组的长度范围。
  2. -104 <= nums[i] <= 104:数组中的元素取值范围。
  3. nums 中的每个值都独一无二。
  4. 题目数据保证 nums 在预先未知的某个下标上进行了旋转。
  5. -104 <= target <= 104:目标值的取值范围。

四、解题思路

  • 一般看到有序序列,且要求时间复杂度为 O(log n),大概率使用二分查找。
  • 分析本题,由于数组在某个位置进行了旋转,原升序数组被分成了两个有序部分(其中一个可能为空)。
  • 可以先利用上一题的方法找出最小值所在位置 n u m s num_s nums,结合最后一个值,确定 t a r g e t target target 在[ 0 0 0 ~ s s s ],还是[ s s s ~ n − 1 n-1 n1]
  • 再进行一次二分搜索查找 t a r g e t target target
  • 总共两次二分,第一次找最小值,第一次找目标值
  • 分析这个思路的时间复杂度;你的思路是合理的,且时间复杂度满足 O ( l o g n ) O(log n) O(logn)
  1. 首先分析找到最小值的过程:

    • 在找最小值的过程中,使用二分查找。每次将搜索区间缩小一半,直到找到最小值。这个过程的时间复杂度为 O ( l o g n ) O(log n) O(logn)。因为每次比较中间值与右边界值,根据大小关系缩小搜索区间,最多进行 l o g n log n logn次比较就能找到最小值。
  2. 然后分析找目标值的过程:

    • 确定了最小值所在位置后,将数组分为两个有序部分,再进行一次二分查找找目标值。同样每次将搜索区间缩小一半,时间复杂度也为 O ( l o g n ) O(log n) O(logn)

所以总体来说,整个过程进行了两次二分查找,时间复杂度为 O ( l o g n ) + O ( l o g n ) = O ( l o g n ) O(log n)+O(log n)=O(log n) O(logn)+O(logn)=O(logn)。因为在大 O O O表示法中,多个对数级操作相加仍然是 O ( l o g n ) O(log n) O(logn)

五、代码实现

  1. 利用上一题的思路找出最小值或对应索引,划分两个区间。
class Solution:
    def findMin(self, nums: List[int]) -> int:
        left, right = 0, len(nums) - 1
        while left < right:
            mid = left + (right - left)//2
            if nums[mid] > nums[right]:
                left = mid + 1
            else:
                right = mid
        return nums[right]
  1. 再次二分查找寻找target
class Solution:
    def findMin(self, nums: List[int]) -> int:
        left, right = 0, len(nums) - 1
        while left < right:
            mid = left + (right - left)//2
            if nums[mid] > nums[right]:
                left = mid + 1
            else:
                right = mid
        return right


    def search(self, nums: List[int], target: int) -> int:
        # 最小值位置索引
        min_s = findMin(nums)
        last_s = len(nums) - 1
        # 得到最小值和数组最后一个值
        min_num = nums[min_s]
        last_num = nums[last_s]
        # 根据target与最小值和末尾元素对比,确定其可能所在区间
        if target > min_num and target <= last_num:
            left = min_s + 1
            right = len(nums) - 1
        else:
            left = 0
            right = min_s
        
        # 进入第二次二分查找
        while left < right:
            mid = left + (right - left) // 2
            if mid < target:
                left = mid + 1
            else:
                right = mid
        if target == nums[right]:
            return right
        else:
            return -1
—————————————————————————————————————————————————————————————————————————————————————————————————————
NameError: name 'findMin' is not defined
            ^^^^^^^
    min_s = findMin(nums)
Line 15 in search (Solution.py)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ret = Solution().search(param_1, param_2)
Line 70 in _driver (Solution.py)
    _driver()
Line 85 in <module> (Solution.py)

这个错误是因为在search方法中调用了findMin函数,但findMin并不是在类的方法内定义的,所以不能直接通过findMin这样的方式调用。

可以将findMin方法定义在类中,或者在search方法中通过self.findMin(nums)这样的方式调用类的方法(前提是findMin是在类中定义的)。以下是修改后的代码:

class Solution:
    def findMin(self, nums: List[int]) -> int:
        left, right = 0, len(nums) - 1
        while left < right:
            mid = left + (right - left)//2
            if nums[mid] > nums[right]:
                left = mid + 1
            else:
                right = mid
        return right


    def search(self, nums: List[int], target: int) -> int:
        # 最小值位置索引
        min_s = self.findMin(nums)
        last_s = len(nums) - 1
        # 得到最小值和数组最后一个值
        min_num = nums[min_s]
        last_num = nums[last_s]
        # 根据target与最小值和末尾元素对比,确定其可能所在区间
        if target > min_num and target <= last_num:
            left = min_s + 1
            right = len(nums) - 1
        else:
            left = 0
            right = min_s
        
        # 进入第二次二分查找
        while left < right:
            mid = left + (right - left) // 2
            if mid < target:
                left = mid + 1
            else:
                right = mid
        if target == nums[right]:
            return right
        else:
            return -1
————————————————————————————————————————————————————————————————————————————————————————————————————————
解答错误
113 / 196 个通过的测试用例

输入
nums =[4,5,6,7,0,1,2]
target = 0

输出
-1
预期结果
4

又粗心了!
问题可能出在以下几个地方:

  1. 在第二次二分查找中,判断条件应该是nums[mid] < target,而不是mid < target。因为要比较的是数组中的值与目标值,而不是中间索引与目标值。

以下是修正后的代码:

        # 进入第二次二分查找
        while left < right:
            mid = left + (right - left) // 2
            if nums[mid] < target:
                left = mid + 1
            else:
                right = mid
        if target == nums[right]:
            return right
        else:
            return -1
——————————————————————————————————————————————————————————————————————————————————————————————————————
解答错误
181 / 196 个通过的测试用例

输入
nums =[4,5,6,7,0,1,2]
target = 0

输出
-1
预期结果
4

接近满分了,到底是哪里出了问题呢?
通过力扣的添加测试用例功能,我发现当target=0时,就会错!?
又尝试了一下,这份答案的问题是无法找到负数和0的位置!~

这个问题并不是因为大于小于号不适用于负数。问题可能出在以下几个地方:

  1. 在判断目标值所在区间时可能存在错误。当目标值小于最小值时,应该正确地设置搜索区间为左半部分(从第一个元素到最小元素索引减一)。

  2. 在第二次二分查找中,当目标值等于中间值时,应该正确地返回中间索引。

以下是修改后的代码:

class Solution:
    def findMin(self, nums):
        left, right = 0, len(nums) - 1
        while left < right:
            mid = left + (right - left) // 2
            if nums[mid] > nums[right]:
                left = mid + 1
            else:
                right = mid
        return left

    def search(self, nums, target):
        # 最小值位置索引
        min_s = self.findMin(nums)
        last_s = len(nums) - 1
        # 得到最小值和数组最后一个值
        min_num = nums[min_s]
        last_num = nums[last_s]
        # 根据 target 与最小值和末尾元素对比,确定其可能所在区间
        if target > min_num and target <= last_num:
            left = min_s + 1
            right = len(nums) - 1
        elif target < min_num:
            left = 0
            right = min_s - 1
        else:
            left = min_s
            right = min_s

        # 进入第二次二分查找
        while left <= right:
            mid = left + (right - left) // 2
            if nums[mid] < target:
                left = mid + 1
            elif nums[mid] > target:
                right = mid - 1
            else:
                return mid
        return -1
_____________________________________________________
是解决了找负数的问题,但是通过用例更低了......

猜测:问题出在了几个区间的划分!
逐一排查各个位置的代码:

class Solution:
    def findMin(self, nums: List[int]) -> int:
        left, right = 0, len(nums) - 1
        while left < right:
            mid = left + (right - left)//2
            if nums[mid] > nums[right]:
                left = mid + 1
            else:
                right = mid
        return left


    def search(self, nums: List[int], target: int) -> int:
        # 最小值位置索引
        min_s = self.findMin(nums)
        last_s = len(nums) - 1
        # 得到最小值和数组最后一个值
        min_num = nums[min_s]
        last_num = nums[last_s]
        # 根据target与最小值和末尾元素对比,确定其可能所在区间
        if target > min_num and target <= last_num:
            left = min_s + 1
            right = len(nums) - 1
        elif target < min_num:
            left = 0
            right = min_s - 1 
        else:
            return min_s
        
        # 进入第二次二分查找
        while left < right:
            mid = left + (right - left) // 2
            if nums[mid] < target:
                left = mid + 1
            elif nums[mid] > target:
                right = mid - 1
            else:
                return mid
        if target == nums[right]:
            return right
        else:
            return -1
————————————————————————————————————————————————————————————————————————————————
无语住了,通过用例下降到了109......

受不了了看看题解吧

class Solution:
    # 153. 寻找旋转排序数组中的最小值
    def findMin(self, nums: List[int]) -> int:
        left, right = -1, len(nums) - 1  # 开区间 (-1, n-1)
        while left + 1 < right:  # 开区间不为空
            mid = (left + right) // 2
            if nums[mid] < nums[-1]:  # 蓝色
                right = mid
            else:  # 红色
                left = mid
        return right

    # 有序数组中找 target 的下标
    def lower_bound(self, nums: List[int], left: int, right: int, target: int) -> int:
        while left + 1 < right:  # 开区间不为空
            mid = (left + right) // 2
            # 循环不变量:
            # nums[left] < target
            # nums[right] >= target
            if nums[mid] < target:
                left = mid  # 范围缩小到 (mid, right)
            else:
                right = mid  # 范围缩小到 (left, mid)
        return right if nums[right] == target else -1

    def search(self, nums: List[int], target: int) -> int:
        i = self.findMin(nums)
        if target > nums[-1]:  # target 在第一段
            return self.lower_bound(nums, -1, i, target)  # 开区间 (-1, i)
        # target 在第二段
        return self.lower_bound(nums, i - 1, len(nums), target)  # 开区间 (i-1, n)


一、整体架构

这段代码的目的是在旋转排序数组中查找目标值的索引,如果目标值不存在则返回 -1。它主要通过两个函数来实现这个目标:findMinsearch

二、findMin函数

  1. 初始化区间
    • 首先将区间初始化为开区间(-1, len(nums) - 1),其中left初始化为 -1,right初始化为数组长度减 1。这个区间表示在整个数组范围内寻找最小值。
  2. 二分查找循环
    • 进入一个循环,条件是left + 1 < right,即当区间不为空时继续循环。
    • 在每次循环中,计算中间位置mid(left + right) // 2
    • 如果nums[mid] < nums[-1],说明中间值小于数组最后一个元素,那么最小值在左半部分(包括中间值),所以将right更新为mid,缩小搜索区间到左半部分。
    • 如果nums[mid] >= nums[-1],说明中间值大于等于数组最后一个元素,那么最小值在右半部分,所以将left更新为mid,缩小搜索区间到右半部分。
  3. 返回最小值下标
    • 当循环结束时,区间长度为 1,此时right指向的位置就是最小值的下标,返回right

三、lower_bound函数

  1. 初始化区间和循环不变量
    • 这个函数用于在给定区间内查找目标值的下界,即第一个大于等于目标值的元素的下标。
    • 初始区间为(left, right),其中leftright是传入的区间边界。
    • 循环不变量为nums[left] < targetnums[right] >= target,这意味着在循环过程中,左边界的值始终小于目标值,右边界的值始终大于等于目标值。
  2. 二分查找循环
    • 进入一个循环,条件是left + 1 < right,即当区间不为空时继续循环。
    • 在每次循环中,计算中间位置mid(left + right) // 2
    • 如果nums[mid] < target,说明中间值小于目标值,那么更新左边界为mid,缩小搜索区间到(mid, right)
    • 如果nums[mid] >= target,说明中间值大于等于目标值,那么更新右边界为mid,缩小搜索区间到(left, mid)
  3. 返回结果
    • 当循环结束时,区间长度为 1,此时如果右边界的值等于目标值,返回右边界下标,否则返回 -1。

四、search函数

  1. 找到最小值下标
    • 调用findMin函数找到旋转数组中的最小值的下标i
  2. 判断目标值所在区间并进行二分查找
    • 如果目标值大于数组最后一个元素,说明目标值在第一段,调用lower_bound函数在开区间(-1, i)内进行二分查找。
    • 如果目标值小于等于数组最后一个元素,说明目标值在第二段:
      • 如果i = 0,说明数组是递增的,直接在开区间(0, len(nums))内进行二分查找(实际上相当于在整个数组范围内查找)。
      • 如果i > 0,在开区间(i - 1, len(nums))内进行二分查找。
    • 这两种情况可以合并成在(i - 1, len(nums))区间内进行二分查找。

总体来说,这段代码利用了旋转排序数组的特性,通过先找到最小值的下标来划分数组为两个有序的区间,然后根据目标值与数组最后一个元素的大小关系确定目标值所在的区间,并在该区间内进行二分查找,从而高效地在旋转排序数组中查找目标值的索引。

写吐了…有空继续写,未完待续…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/906283.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

反悔贪心

Problem - C - Codeforces&#xff08;初识反悔贪心&#xff09; 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; #include <bits/stdc.h> #define fi first #define se secondusing namespace std; typedef pair<int,int> PII;string a, b, ans; bool vis…

Cisco Packet Tracer 8.0 路由器静态路由配置

文章目录 静态路由简介一、定义与特点二、配置与命令三、优点与缺点四、应用场景 一&#xff0c;搭建拓扑图二&#xff0c;配置pc IP地址三&#xff0c;pc0 ping pc1 timeout四&#xff0c;配置路由器Router0五&#xff0c;配置路由器Router1六&#xff0c;测试 静态路由简介 …

burp靶场-Remote code execution via web shell upload

Lab: 通过 Web shell 上传远程执行代码 This lab contains a vulnerable image upload function. It doesn’t perform any validation on the files users upload before storing them on the server’s filesystem. 此实验室包含易受攻击的映像上传功能。在将用户上传的文件…

极简实现酷炫动效:Flutter隐式动画指南第二篇之一些酷炫的隐式动画效果

目录 前言 1.弹性放大按钮效果 2.旋转和缩放组合动画 3.颜色渐变背景动画 4.缩放进出效果 前言 在上一篇文章中&#xff0c;我们介绍了Flutter中的隐式动画的一些相关知识&#xff0c;在这篇文章中,我们可以结合多个隐式动画 Widget 在 Flutter 中创建一些酷炫的视觉效果&…

后端:Spring-1

文章目录 1. 了解 spring(Spring Framework)2. 基于maven搭建Spring框架2.1 纯xml配置方式来实现Spring2.2 注解方式来实现Spring3. Java Config类来实现Spring 2.4 总结 1. 了解 spring(Spring Framework) 传统方式构建spring(指的是Spring Framework)项目&#xff0c;导入依…

qt QStackedLayout详解

QStackedLayout类提供了一种布局方式&#xff0c;使得在同一时间内只有一个子部件&#xff08;或称为页面&#xff09;是可见的。这些子部件被维护在一个堆栈中&#xff0c;用户可以通过切换来显示不同的子部件&#xff0c;适合用在需要动态显示不同界面的场景&#xff0c;如向…

C++进阶:C++11的新特性

✨✨所属专栏&#xff1a;C✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ C11的发展历史 2011年&#xff0c;C标准委员会发布了C11标准&#xff0c;这是C的一次巨大飞跃&#xff0c;引入了许多重要的新特性&#xff0c;如智能指针、lambda表达式、并发编程支持等。这一版本的发布对C社…

GA/T1400视图库平台EasyCVR视频分析设备平台微信H5小程序:智能视频监控的新篇章

GA/T1400视图库平台EasyCVR是一款综合性的视频管理工具&#xff0c;它兼容Windows、Linux&#xff08;包括CentOS和Ubuntu&#xff09;以及国产操作系统。这个平台不仅能够接入多种协议&#xff0c;还能将不同格式的视频数据统一转换为标准化的视频流&#xff0c;通过无需插件的…

OpenAI推出搜索GPT,进军搜索引擎领域

OpenAI 推出了一项新功能——Search GPT&#xff0c;为 ChatGPT 引入实时网络搜索功能&#xff0c;使其站上与 Google 和 Bing 等搜索巨头竞争的舞台。 OpenAI 产品的重大变化&#xff0c;Search GPT 承诺提供快捷、实时的答案&#xff0c;并附上可靠来源的链接。 ChatGPT 一直…

Unity XR Interaction Toolkit 开发教程(3)快速配置交互:移动、抓取、UI交互【3.0以上版本】

获取完整课程以及答疑&#xff0c;工程文件下载&#xff1a; https://www.spatialxr.tech/ 视频试看链接&#xff1a; 3.快速配置交互&#xff1a;移动、抓取、UI交互【Unity XR Interaction Toolkit 跨平台开发教程】&#xff08;3.0以上版本&#xff09; 系列教程专栏&…

SE-Net模型实现猴痘病识别

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【DeepLabV3模型实现人体部位分割CIHP数据】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.…

深度学习之权重、偏差

1 权重偏差初始化 1.1 全都初始化为 0 偏差初始化陷阱&#xff1a; 都初始化为 0。 产生陷阱原因&#xff1a;因为并不知道在训练神经网络中每一个权重最后的值&#xff0c;但是如果进行了恰当的数据归一化后&#xff0c;我们可以有理由认为有一半的权重是正的&#xff0c;另…

企业物流管理数据仓库建设的全面指南

文章目录 一、物流管理目标二、总体要求三、数据分层和数据构成&#xff08;1&#xff09;数据分层&#xff08;2&#xff09;数据构成 四、数据存储五、数据建模和数据模型&#xff08;1&#xff09;数据建模&#xff08;2&#xff09;数据模型 六、总结 在企业物流管理中&…

Spring Boot 与 EasyExcel 携手:复杂 Excel 表格高效导入导出实战

数据的并行导出与压缩下载&#xff1a;EasyExcel&#xff1a;实现大规模数据的并行导出与压缩下载 构建高效排队导出&#xff1a;解决多人同时导出Excel导致的服务器崩溃 SpringBoot集成EasyExcel 3.x&#xff1a; 前言 在企业级应用开发中&#xff0c;常常需要处理复杂的 …

【网络篇】计算机网络——链路层详述(笔记)

目录 一、链路层 1. 概述 2. 链路层提供的服务 &#xff08;1&#xff09;成帧&#xff08;framing&#xff09; &#xff08;2&#xff09;链路接入 &#xff08;3&#xff09;可靠交付 &#xff08;4&#xff09;差错检测和纠正 3. 链路层的实现 二、多路访问链路和…

Android——显式/隐式Intent

概述 在Android中&#xff0c;Intent是各个组件之间信息通信的桥梁&#xff0c;它用于Android各组件的通信。 Intent 的组成部分 一、显式 Intent 第一种方式 Intent intent new Intent(this, ActFinishActivity.class);startActivity(intent);第二种方式 Intent intent …

__init__.py __all__和 __name__的作用及其用法

__ init__.py 的作用及其用法&#xff1a; 包下的__init__.py 所在目录是一个模块包,本身也是一个模块,可用于定义模糊导入时要导入的内容。当我们导入一个包的时候&#xff0c;包下的__init__.py中的代码会自动执行&#xff0c;因此在某些大的项目被使用频率较高的模块&#x…

曹操出行借助 ApsaraMQ for Kafka Serverless 提升效率,成本节省超 20%

本文整理于 2024 年云栖大会主题演讲《云消息队列 ApsaraMQ Serverless 演进》&#xff0c;杭州优行科技有限公司消息中间件负责人王智洋分享 ApsaraMQ for Kafka Serverless 助力曹操出行实现成本优化和效率提升的实践经验。 曹操出行&#xff1a;科技驱动共享出行未来 曹操…

《探索 HarmonyOS NEXT(5.0):开启构建模块化项目架构奇幻之旅 —— Tabs底部导航栏》

简介 通过学习HarmonyOS Next&#xff0c;实战项目WanAndroid 鸿蒙版&#xff0c;API接口均来自WanAndroid 开源接口&#xff0c;我们一起来做个App吧。 玩Android 开放API&#xff1a;https://www.wanandroid.com/blog/show/2 效果图 创建每个模块下的各个目录 1、feature…

LinkedList 分析

LinkedList 简介 LinkedList 是一个基于双向链表实现的集合类&#xff0c;经常被拿来和 ArrayList 做比较。关于 LinkedList 和ArrayList的详细对比&#xff0c;我们 Java 集合常见面试题总结(上)有详细介绍到。 双向链表 不过&#xff0c;我们在项目中一般是不会使用到 Link…