【LeetCode每日一题】【2023/1/15】2293. 极大极小游戏

news2024/12/24 10:23:34

文章目录

  • 2293. 极大极小游戏
    • 方法1:双指针


2293. 极大极小游戏

LeetCode: 2293. 极大极小游戏

简单 \color{#00AF9B}{简单} 简单

给你一个下标从 0 开始的整数数组 nums ,其长度是 2 的幂。

nums 执行下述算法:

  1. n 等于 nums 的长度,如果 n == 1终止 算法过程。否则,创建 一个新的整数数组 newNums ,新数组长度为 n / 2 ,下标从 0 开始。

  2. 对于满足 0 <= i < n / 2 的每个 偶数 下标 i ,将 newNums[i] 赋值 为 min(nums[2 * i], nums[2 * i + 1])

  3. 对于满足 0 <= i < n / 2 的每个 奇数 下标 i ,将 newNums[i] 赋值 为 max(nums[2 * i], nums[2 * i + 1])

  4. newNums 替换 nums

  5. 从步骤 1 开始 重复 整个过程。

执行算法后,返回 nums 中剩下的那个数字。

示例 1:

在这里插入图片描述

输入:nums = [1,3,5,2,4,8,2,2]
输出:1
解释:重复执行算法会得到下述数组。
第一轮:nums = [1,5,4,2]
第二轮:nums = [1,4]
第三轮:nums = [1]
1 是最后剩下的那个数字,返回 1

示例 2:

输入:nums = [3]
输出:3
解释:3 就是最后剩下的数字,返回 3

提示:

  • 1 <= nums.length <= 1024
  • 1 <= nums[i] <= 10^9
  • nums.length2 的幂

方法1:双指针

我们可以从 示例 1 中看到,本题的计算流程可以构成一个完全二叉树。每一层的每两个结点计算出一个值(父结点)。

我们在每处理两个数据后,可以看作这两个数据已经没有用了,同时也就意味着它们所处的 位置 也就空出来了;然后我们可以将结果存到空出来的地方。每处理 2 个数据,我们需要占用 1 个位置来存放结果,这样就空出来了一个位置,而这个位置可以存放后两个数的结果。如:

  1. 处理第 0 和第 1 个数时,结果存入 0 处;
  2. 处理第 2 和第 3 个数时,结果存入 1 处;
  3. 处理第 4 和第 5 个数时,结果存入 2 处;

在定位两边的每次运动位置时,可以发现即将 处理 的数据总是两个两个往后遍历,结果的存放总是一个一个往后走。这就可以理解为双指针,快的指针每次走 2 步,慢的指针的步长则是 1 步。

这样一来,就得到了对于完全二叉树中某一层的遍历的思路。那么如何做到层之间的连续遍历呢?由于将每一层遍历完后,我们 有用 的数据就减少了一半,而下一层的处理便是用这些数据。我们可以限定快指针的范围。第 1 次让快指针遍历整个数组,第 2 次则让快指针遍历前一半的数组即可。

由于题目给出条件:数组 nums 的长度为 2 的整数次幂,那就表明这个长度就一定能被 2 整除。快指针每次走2步也就不会产生 少处理数据 或者 越界 的错误。

#include <vector>
#include <utility>
using namespace std;

class Solution
{
public:
    int minMaxGame(vector<int> &nums)
    {
        for (int count = nums.size(); count != 1; count >>= 1)
        {
            for (int fast = 0, slow = 0; fast <= count - 1; fast += 2, ++slow)
            {
                if ((slow & 1) == 0)
                    nums[slow] = std::min(nums[fast], nums[fast + 1]);
                else
                    nums[slow] = std::max(nums[fast], nums[fast + 1]);
            }
        }

        return nums[0];
    }
};

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n)。其中,n 为数组 nums 的长度。
    • 第一次循环的时间复杂度为 O ( n ) O(n) O(n) ,之后每次循环的时间复杂度依次减半。因此时间复杂度最终为:

O ( n ) + O ( n 2 ) + O ( n 4 ) + . . . = O ( n × lim ⁡ k → 0 + 1 × ( 1 − ( 1 2 ) k ) 1 − 1 2 ) = O ( n × 1 1 − 1 2 ) = O ( n ) O(n) + O(\frac{n}{2}) + O(\frac{n}{4}) + ... = O(n \times \lim_{k \to 0^+}{\frac{1 \times (1 - (\frac{1}{2})^k)}{1 - \frac{1}{2}}}) = O(n \times \frac{1}{1 - \frac{1}{2}}) = O(n) O(n)+O(2n)+O(4n)+...=O(n×k0+lim1211×(1(21)k))=O(n×1211)=O(n)

  • 空间复杂度: O ( 1 ) O(1) O(1)。我们使用 nums 数组原地处理数据,没有用到额外的、大小与输入数据有关的变量,因此常用常数的额外空间。

参考结果

Accepted
96/96 cases passed (4 ms)
Your runtime beats 94.42 % of cpp submissions
Your memory usage beats 70.70 % of cpp submissions (9.5 MB)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows 10的子系统不是非Ubuntu不可

Ubuntu 的制造商 Canonical 早已和微软进行合作&#xff0c;让我们体验了极具争议的 Bash on Windows。外界对此也是褒贬不一&#xff0c;许多 Linux 重度用户则是质疑其是否有用&#xff0c;以及更进一步认为 Bash on Windows 是一个安全隐患。 Unix 的 Bash 是通过 WSL&#…

MyBatis动态设置表名 获取添加功能自增的主键 自定义映射

MyBatis动态设置表名 获取添加功能自增的主键 自定义映射动态设置表名获取添加功能自增的主键自定义映射解决字段名和属性名不一致的情况为字段起别名,保持和属性名的一致设置全局配置,保持和属性名的一致通过resultMap设置自定义的映射关系动态设置表名 mapper接口&#xff1a…

Java实现线段树

问题一&#xff1a;开始的子区间是怎么分的&#xff1f; M (LR)/2&#xff0c;左子区间为[L,M]&#xff0c;右子区间为[M1,R] 问题二&#xff1a;如何进行区间统计&#xff1f; 假设这13个数为1,2,3,4,1,2,3,4,1,2,3,4,1. 在区间之后标上该区间的数字之和&#xff1a; 如…

Windows安全加固-AD建立与加入

AD建立与加入 实验环境说明&#xff1a; 域控从机&#xff1a; Windows 2003 域控主机&#xff1a; Windows 2008 IP设置 设置同一网段-保证连通性 将NDS指向Windos2008 第一步&#xff0c;域控服务器需要将服务器设为静态 IP地址 1.将Windows2008服务器IP地址修改为192.1…

c++ - 第24节 - c++的IO流

1.C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf()与printf()。 scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放在变量中。printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。注意宽度输出和精度输出控制。C语言借助了相应的缓冲区…

【Android gradle】自定义一个android gradle插件之buildSrc

文章目录1. 前言2. 简单使用3. 其余用法3.1 依赖&版本管理3.2 插件版本自增3.3 其余4. 链接1. 前言 在【Android gradle】自定义一个android gradle插件&#xff0c;并发布到私有Artifactory仓库这篇文章中介绍了定义一个gradle插件&#xff0c;然后发布到远程或者本地仓库…

对数据库索引和事务的理解

1.数据库授权命令&#xff1a; GRANT<权限> on 表名(或列名) to 用户。 举例&#xff1a; 授予用户SQLTest对数据库Sales的CUSTOMERS表的列cid、cname的查询权限 grant select on CUSTOMERS(cid,cname) to SQLTest; 2.MySQL索引&#xff08;index&#xff09; 什么是索引…

C++5:初见模板

目录 函数模板 函数模板的实例化&#xff1a; 隐式实例化 显示实例化 类模板 虽然学习了类和对象&#xff0c;能很方便的处理一些容器类的问题&#xff0c;但是我们还是会遇到如下这种情况。 我们创建一个简单的stack类 class Stack { public:Stack(){} private:int* _a;…

【机器学习】Logistic Regression 逻辑回归算法详解 + Java代码实现

文章目录一、逻辑回归简介1.1 什么是逻辑回归1.2 Sigmoid函数1.3 预测函数二、逻辑回归实战 - Java代码实现一、逻辑回归简介 1.1 什么是逻辑回归 逻辑回归&#xff08;Logistic Regression&#xff09;是一种用于解决二分类&#xff08;0 or 1&#xff09;问题的机器学习方法…

时间序列模型SCINet模型(自定义项目)

前言 读完代码解析篇&#xff0c;我们针对开源项目中的模型预测方法做一下介绍。Github源码下载地址下载数据集ETTh、PEMS、Traffic、Splar-Energy、Electricity、Exchange-Rate&#xff0c;这几类公共数据集的任意一类就行。这里以ETTh数据集为例&#xff0c;先在项目文件夹下…

whistle抓包工具应用

原文地址&#xff1a;(67条消息) whistle抓包工具学习_BBC蟹耳总的博客-CSDN博客_w2 抓包 一、安装whistle 首先安装好whistle抓包工具&#xff0c;有以下两个步骤 在终端中全局安装whistle&#xff1a;npm install -g whistle可以通过whistle help查看相关信息&#xff0c;…

《零基础学机器学习》读书笔记一

《零基础学机器学习》读书笔记一 一、机器学习快速上手路径 1.1 机器学习的家族谱 人工智能&#xff0c;可以被简单地定义为努力将通常由人类完成的智力任务自动化。 AI效应的2个阶段&#xff1a; &#xff08;1&#xff09;AI将新技术、新体验带进人类的生活&#xff0c;完…

linux环境安装mysql5.7版本

目录 一、下载准备阶段 二、安装运行阶段 linux环境安装mysql是我们工程师必备的技能之一&#xff0c;今天我们实战分享一下安装流程&#xff1a; 一、下载准备阶段 1、查看linux系统是否已经安装mysql rpm -qa|grep -i mysql 显示没有 如果安装过&#xff0c;可以删除&…

DFS排列组合与连通性

目录 一、前言 二、DFS与排列组合 1、DFS&#xff1a;自写排列算法1 &#xff08;1&#xff09;基础模板 &#xff08;2&#xff09;基于(1)输出前n个数任意m个都全排列 2、DFS&#xff1a;自写排列算法2&#xff08;这个写法更常见&#xff09; &#xff08;1&#xff…

Java安装详细教程

这里写自定义目录标题Java安装详细教程1.下载Java2&#xff0c;找到jdk8进行下载3.安装jdk4.配置环境变量5.查看是否已经成功安装Java安装详细教程 换了新电脑了&#xff0c;需要安装Java&#xff0c;如果对你也有帮助就点个赞吧~~ 文章目录Java安装详细教程1.下载Java2&#…

一阶低通滤波器学习

导读&#xff1a;电压型磁链观测器由于物理概念清晰、简单易用而备受关注。然而电压型磁链观测器包含一纯积分项&#xff0c;被积项的初始相位与直流偏置都会影响积分结果。所以对传统电压型磁链观测器的改进措施有很多&#xff0c;本期文章主要介绍采用一阶低通滤波器来替换掉…

Java程序设计实验2 | Java语言基础

*本文是博主对Java各种实验的再整理与详解&#xff0c;除了代码部分和解析部分&#xff0c;一些题目还增加了拓展部分&#xff08;⭐&#xff09;。拓展部分不是实验报告中原有的内容&#xff0c;而是博主本人自己的补充&#xff0c;以方便大家额外学习、参考。 目录 一、实验…

微信小程序使用npm包、全局数据共享和分包

文章目录导航路线使用 npm 包小程序对 npm 的支持与限制Vant Weapp1. 什么是 Vant Weapp2. 安装 Vant 组件库3. 使用 Vant 组件4. 定制全局主题样式5. 定制全局主题样式API Promise化1. 基于回调函数的异步 API 的缺点2. 什么是 API Promise 化3. 实现 API Promise 化4. 调用 P…

鸣人的影分身(动态规划 | DP | 整数划分模型)[《信息学奥赛一本通》]

题目如下&#xff1a; 在火影忍者的世界里&#xff0c;令敌人捉摸不透是非常关键的。 我们的主角漩涡鸣人所拥有的一个招数——多重影分身之术——就是一个很好的例子。 影分身是由鸣人身体的查克拉能量制造的&#xff0c;使用的查克拉越多&#xff0c;制造出的影分身越强。…

6.R语言【频数、频率统计函数】一维、二维、三维

b站课程视频链接&#xff1a; https://www.bilibili.com/video/BV19x411X7C6?p1 腾讯课堂(最新&#xff0c;但是要花钱&#xff0c;我花99&#x1f622;&#x1f622;元买了&#xff0c;感觉讲的没问题&#xff0c;就是知识点结构有点乱&#xff0c;有点废话&#xff09;&…