Java C++题解leetcode672灯泡开关示例

 更新时间:2022年09月29日 14:27:03   作者:AnjaVon  
这篇文章主要为大家介绍了Java C++题解leetcode672灯泡开关示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

题目要求

思路:找规律

找到尽可能最精简的通项表达,今日参考:京城打工人

首先,归纳每个开关会影响的灯,其中(k=0,1,2,…):

开关反转灯编号
k
2k
2k+1
3k+1

可见灯以6盏为周期具有相同变化,所以以下只需要推导第一个周期里的6盏灯即可。

观察前6盏灯:

开关
1一、三、四
2一、二
3一、三
4一、二、四
5一、三
6一、二

发现灯2、6和3、5分别受同样的开关影响,所以状态相同;

观察前4盏灯,发现灯1、3与灯2、4存在规律:

  • 当开关按动次数为数时,两组灯状态分别相同
  • 当开关按动次数为数时,两组灯状态分别不同
  • 所以根据其中一组灯的状态即可判断另一组。

因此,选择一组+另一组中的一盏,即可涵盖所有灯的状态。

因此选择观察前三盏灯即可预知所有明暗状态:

前三盏灯在不同按动次数中的状态如下:

发现在一次按动时会出现四种状态,两次按动时出现七种状态【缺少011状态】,三次及以上按动即可出现所有状态,共2^3=8种。

此时仅需枚举一盏灯和两盏灯时的状态即可,后续都与三盏相同:

  • 一盏灯仅可能有两种状态;
  • 两盏灯可能有四种状态;

但按动一次时仅会出现三种情况【缺少11状态】:

  • 将上述规律归纳为代码即可!

Java

class Solution {
    public int flipLights(int n, int presses) {
        if (presses == 0)
            return 1;
        if (n == 1)
            return 2;
        else if (n == 2)
            return presses == 1 ? 3 : 4;
        else
            return presses == 1 ? 4 : presses == 2 ? 7 : 8;
    }
}
  • 时间复杂度:O(1)O(1)O(1)
  • 空间复杂度:O(1)O(1)O(1)

C++

class Solution {
public:
    int flipLights(int n, int presses) {
        if (presses == 0)
            return 1;
        if (n == 1)
            return 2;
        else if (n == 2)
            return presses == 1 ? 3 : 4;
        else
            return presses == 1 ? 4 : presses == 2 ? 7 : 8;
    }
};
  • 时间复杂度:O(1)
  • 空间复杂度:O(1)

Rust

  • 浅学一下rust的match~
impl Solution {
    pub fn flip_lights(n: i32, presses: i32) -> i32 {
        if presses == 0 {
            return 1;
        }
        match n {
            1 => 2,
            2 => {
                match presses {
                    1 => 3,
                    _ => 4
                }
            },
            _ => {
                match presses {
                    1 => 4,
                    2 => 7,
                    _ => 8
                }
            },
        }
    }
}
  • 时间复杂度:O(1)
  • 空间复杂度:O(1)

总结

本来以为要DP或者生模拟,结果是数学思维找规律。

一道代码无敌简单,思路究极绕的题目,以至于推导完思路感觉就结束了【代码都没啥区别……】

以上就是Java C++题解leetcode672灯泡开关示例的详细内容,更多关于Java C++题解灯泡开关的资料请关注脚本之家其它相关文章!

相关文章

  • java使用单向链表解决数据存储自定义排序问题

    java使用单向链表解决数据存储自定义排序问题

    本文主要介绍了java使用单向链表解决数据存储自定义排序问题,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Java设计模式之java原型模式详解

    Java设计模式之java原型模式详解

    这篇文章主要介绍了Java设计模式之原型模式详解,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-09-09
  • 基于Security实现OIDC单点登录的详细流程

    基于Security实现OIDC单点登录的详细流程

    本文主要是给大家介绍 OIDC 的核心概念以及如何通过对 Spring Security 的授权码模式进行扩展来实现 OIDC 的单点登录。对Security实现OIDC单点登录的详细过程感兴趣的朋友,一起看看吧
    2021-09-09
  • SpringBoot 常用读取配置文件的三种方法详解

    SpringBoot 常用读取配置文件的三种方法详解

    这篇文章主要介绍了SpringBoot 常用读取配置文件的3种方法,通过本文学习可以解决Spring Boot有哪些常用的读取配置文件方式,一些复杂的数据结构,如list,map如何配置,带着这些问题一起通过本文学习吧
    2022-09-09
  • SpringBoot 分模块开发的操作方法

    SpringBoot 分模块开发的操作方法

    这篇文章主要介绍了SpringBoot 分模块开发的操作方法,通过在原项目新增一个maven模块,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • 使用Maven进行多模块项目管理的操作步骤

    使用Maven进行多模块项目管理的操作步骤

    使用Maven进行多模块项目管理可以清晰组织大型项目结构,便于维护和构建,详细步骤包括创建父项目,设置pom.xml,创建子模块,并配置子模块的pom.xml,在父项目中管理依赖,通过命令行构建项目,确保配置一致性
    2024-10-10
  • jdbc链接远程数据库进行修改url操作

    jdbc链接远程数据库进行修改url操作

    这篇文章主要为大家详细介绍了jdbc链接远程数据库进行修改url操作,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • MyBatisPlus-QueryWrapper多条件查询及修改方式

    MyBatisPlus-QueryWrapper多条件查询及修改方式

    这篇文章主要介绍了MyBatisPlus-QueryWrapper多条件查询及修改方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 收集的一些常用java正则表达式

    收集的一些常用java正则表达式

    收集的一些常用java正则表达式,需要的朋友可以参考一下
    2013-02-02
  • Spring Boot异常处理问题小结

    Spring Boot异常处理问题小结

    在 Spring Boot 中,异常处理是一个重要的部分,可以允许开发者优雅地处理应用程序中可能发生的错误和异常,这篇文章主要介绍了Spring Boot异常处理问题小结,需要的朋友可以参考下
    2024-05-05

最新评论