每日OJ题_贪心算法四④_力扣397. 整数替换

目录

力扣397. 整数替换

解析代码


力扣397. 整数替换

397. 整数替换

难度 中等

给定一个正整数 n ,你可以做如下操作:

  1. 如果 n 是偶数,则用 n / 2替换 n 
  2. 如果 n 是奇数,则可以用 n + 1n - 1替换 n 。

返回 n 变为 1 所需的 最小替换次数 。

示例 1:

输入:n = 8
输出:3
解释:8 -> 4 -> 2 -> 1

示例 2:

输入:n = 7
输出:4
解释:7 -> 8 -> 4 -> 2 -> 1
或 7 -> 6 -> 3 -> 2 -> 1

示例 3:

输入:n = 4
输出:2

提示:

  • 1 <= n <= 2^31 - 1
class Solution {
public:int integerReplacement(int n) {}
};

解析代码1_递归改记忆化搜索

        此题的贪心策略很难想出来,先看看记忆化搜索的方法(记忆化搜索在之前专题已经学过):用爆搜模拟也可以过,但是加上备忘录优化:

class Solution {unordered_map<int, int> memo;
public:int integerReplacement(int n) {// 时间O(logN) 空间O(logN)return dfs(n);}int dfs(long long n){if(n == 1)return 0;if(memo[n] != 0)return memo[n];if(n % 2 == 0){memo[n] = 1 + dfs(n / 2);return memo[n];}else{memo[n] = 1 + min(dfs(n - 1), dfs(n + 1));return memo[n];}}
};


解析代码2_贪心策略

贪心策略:任何选择都应该让这个数尽可能快的变成 1 。

  • 对于偶数:只执行除 2 操作。
  • 对于奇数:
  1. 当 n== 1 的时候,不用执行任何操作。
  2. 当 n == 3 的时候,变成 1 的最优操作数是 2 。
  3. 当 n > 1 && n % 4 == 1的时候,那么它的二进制表示是 ......01 ,最优的方式应该选择 -1 ,这样就可以把末尾的 1 干掉,接下来执行除法操作,能够更快地变成1 。
  4. 当 n > 3 && n % 4 == 3的时候,那么它的二进制表示是 ......11 ,最优的方式应该选择 +1 ,这样可以把一堆连续的 1 转换成 0 ,更快地变成 1 。
class Solution {
public:int integerReplacement(int n){// 时间O(logN) 空间O(1)int ret = 0;while(n != 1){if(n % 2 == 0){n =  n / 2;++ret;}else{ret += 2; // 下面操作都是两步if(n == 3)break;else if(n % 4 == 1) // ......01n /= 2; // 和减1除2结果一样else // ......01n = n / 2 + 1; // 和加1除2结果一样,防溢出}}return ret;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决常见的Android问题

常见问题&#xff1a; 1、查杀&#xff1a; 查杀一般分为两个方向一种是内存不足的查杀&#xff0c;一种的是因为温度限频查杀&#xff0c;统称为内存查杀&#xff0c;两个问题的分析思路不同 1、内存不足查杀&#xff1a; 主要是因为当用户出现后台运行多个APP或者是相机等…

【020】基于JavaWeb实现的批报管理系统

项目介绍 基于jspservlet实现的批报管理系统采用B/S架构,该项目设计了一个角色管理员&#xff0c;管理员实现了我的案件、查询统计、项目维护等三大功能模块 技术栈 开发工具&#xff1a;Idea2020.3 运行环境&#xff1a;jdk1.8tomcat9.0mysql5.7 服务端技术&#xff1a;j…

Vue3实战笔记(13)—pinia安装笔记

文章目录 前言安装和配置pinia总结 前言 Pinia 是 Vue 的专属状态管理库&#xff0c;它允许你跨组件或页面共享状态。 Pinia是一个轻量级的状态管理库&#xff0c;它专注于提供一个简单的API来管理应用程序的状态。相比之下&#xff0c;Vuex是一个更完整的状态管理库&#xf…

WVP-GB28181摄像头管理平台 user 信息泄露漏洞复现

0x01 产品简介 GB28181是公共安全视频监控联网系统信息传输、交换、控制技术要求的标准。该标准主要定义了基于IP网络的音视频监控系统的整体架构&#xff0c;包括前端设备、存储设备、管理平台等组成部分&#xff0c;以及设备接入、流媒体传输、信令交互、存储管理、安全防护…

[muduo网络库]——muduo库Buffer类(剖析muduo网络库核心部分、设计思想)

接着之前我们[muduo网络库]——muduo库Socket类&#xff08;剖析muduo网络库核心部分、设计思想&#xff09;&#xff0c;我们接下来继续看muduo库中的Buffer类。其实Buffer在我的另一篇博客里面已经介绍过了深究muduo网络库的Buffer类&#xff01;&#xff01;&#xff01;&am…

IPv6路由配置:ripng、ospfv3、静态路由

本次主要是对ipv6路由的配置&#xff0c;先了解ipv6&#xff0c;再进行实验配置 目录 一、&#x1f349; 什么是IPV6&#xff1f;&#x1f31f;IPv6的主要特点 二、&#x1f349;IPv6和IPv4的对比&#x1f31f; 共同点:&#x1f31f; IPv4的优缺点:&#x1f31f; IPv6的优缺点:…

Python多线程与互斥锁模拟抢购余票的示例

一、示例代码&#xff1a; from threading import Thread from threading import Lock import timen 100 # 共100张票def task():global nmutex.acquire() # 上锁temp ntime.sleep(0.1)n temp - 1print(购票成…

Java入门基础学习笔记18——赋值运算符

赋值运算符&#xff1a; 就是“”&#xff0c;就是给变量赋值的&#xff0c;从右边往左边看。 int a 10; // 把数据赋值给左边的变量a存储。 扩展赋值运算符&#xff1a; 注意&#xff1a;扩展的赋值运算符隐含了强制类型转换。 package cn.ensource.operator;public class…

使用Three.js绘制快速而逼真的水

本文将利用GPUComputationRenderer来实现水波纹的绘制&#xff0c;相似的案例可以看threejs官方的GPGPU Water示例。更多精彩内容尽在数字孪生平台。 什么是 GPGPU GPGPU代表通用图形处理单元&#xff08;General-Purpose Graphic Processing Unit&#xff09;&#xff0c;意思…

triton编译学习

一 流程 Triton-MLIR: 从DSL到PTX - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/671434808Superjomns blog | OpenAI/Triton MLIR 迁移工作简介https://superjom

【每日刷题】Day38

【每日刷题】Day38 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 2696. 删除子串后的字符串最小长度 - 力扣&#xff08;LeetCode&#xff09; 2. LCR 123. 图书整理…

避坑指南!RK3588香橙派yolov5生成RKNN模型!

地址1&#xff0c;转换模型 地址2&#xff0c;转换模型 地址3&#xff0c;解决ppa 下载k2 本文目录 一、将.pt模型转为onnx模型文件。&#xff08;Windows&#xff09;二、将.onnx模型转为.rknn模型文件。&#xff08;Linux&#xff09;三、将.rknn模型部署到开发板RK3588中…