754. Reach a Number

2023-12-21 16:09
文章标签 number 754 reach

本文主要是介绍754. Reach a Number,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

754. 到达终点数字

在一根无限长的数轴上,你站在0的位置。终点在target的位置。

每次你可以选择向左或向右移动。第 n 次移动(从 1 开始),可以走 n 步。

返回到达终点需要的最小移动次数。

示例 1:

输入: target = 3
输出: 2
解释:
第一次移动,从 0 到 1 。
第二次移动,从 1 到 3 。

示例 2:

输入: target = 2
输出: 3
解释:
第一次移动,从 0 到 1 。
第二次移动,从 1 到 -1 。
第三次移动,从 -1 到 2 。

注意:

  • target是在[-10^9, 10^9]范围中的非零整数。

解法一

//时间复杂度O(1), 空间复杂度O(1)
class Solution {
public:int reachNumber(int target) {int n = ceil( (sqrt(1 + 8.0 * abs(target)) - 1 ) / 2);int sum = n * (n + 1) / 2;int diff = sum - target;if(diff % 2 == 0) return n;if(n % 2 == 0) return n + 1;return n + 2;}
};

思路:

这个题标签是简单难度,但是如果第一次做只凭自己想还是很难做出来的,需要发现一些隐含的规律。

此题换一种表达,大概如下:

对于一个n个元素的序列 ±1, ±2, ±3, ±4, ..., ±n. ±号意思是每个元素均可取正或取负。现在给定一个非负整数target,求n的最小值,使这个序列的和刚好为target。

代码的计算步骤如下:

  1. 从n = +1开始累加,直到累加和sum >= target;这一步的n及sum可以直接解二次方程计算出来:
int n = ceil( (sqrt(1 + 8.0 * abs(target)) - 1 ) / 2);
int sum = n * (n + 1) / 2;

ceil是向上取整;对target取绝对值,因为对称性,target正负不影响计算结果,统一当成正整数。 2. 然后计算累计和sum与目标target的差:

    int diff = sum - target;
  1. 接下来要分情况了。
  2. 第一种情况:diff = 0。理想情况,此时说明累加n步刚好到达target,此时返回n即可;
  3. 第二种情况:diff为偶数。此时的累计和sum虽然比target大,但是可以将序列中的第 diff / 2 个元素的正号改为负号,此时其和就是target。这种情况同样返回n即可。
  4. 第三种情况:diff为奇数 且 n 为偶数。此时只需要将sum再加上一个 n + 1,就可以凑成第二种情况的条件(diff为偶数)。此时返回 n + 1 就是答案。
  5. 第四种情况:diff为奇数 且 n 为奇数。此时需要将sum加上一个 n + 1 及 n + 2 才可凑成第二种情况。这样返回 n + 2 就是答案。
  6. 第一种情况可以与第二种情况合并,体现到代码上就是:
    //求出n和sum, 使sum >= target且n最小int n = ceil( (sqrt(1 + 8.0 * abs(target)) - 1 ) / 2);int sum = n * (n + 1) / 2;//求出和与目标数的差diffint diff = sum - target;//如果差为偶数, 直接返回nif(diff % 2 == 0) return n;//如果差为奇数, 且n为偶数, 返回n + 1if(n % 2 == 0) return n + 1;//如果差为奇数, 且n为奇数, 返回n + 2return n + 2;
2019/07/01 22:14

这篇关于754. Reach a Number的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/520631

相关文章

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

题目1380:lucky number

题目1380:lucky number 时间限制:3 秒 内存限制:3 兆 特殊判题:否 提交:2839 解决:300 题目描述: 每个人有自己的lucky number,小A也一样。不过他的lucky number定义不一样。他认为一个序列中某些数出现的次数为n的话,都是他的lucky number。但是,现在这个序列很大,他无法快速找到所有lucky number。既然

Jenkins 通过 Version Number Plugin 自动生成和管理构建的版本号

步骤 1:安装 Version Number Plugin 登录 Jenkins 的管理界面。进入 “Manage Jenkins” -> “Manage Plugins”。在 “Available” 选项卡中搜索 “Version Number Plugin”。选中并安装插件,完成后可能需要重启 Jenkins。 步骤 2:配置版本号生成 打开项目配置页面。在下方找到 “Build Env

【Hdu】Minimum Inversion Number(逆序,线段树)

利用线段树在nlogn的时间复杂度内求一段数的逆序。 由于给的序列是由0 ~ n -1组成的,求出初始的逆序之后可以递推出移动之后的逆序数。 #include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const in

【JavaScript】基本数据类型与引用数据类型区别(及为什么String、Boolean、Number基本数据类型会有属性和方法?)

基本数据类型   JavaScript基本数据类型包括:undefined、null、number、boolean、string。基本数据类型是按值访问的,就是说我们可以操作保存在变量中的实际的值。 1)基本数据类型的值是不可变的 任何方法都无法改变一个基本类型的值,比如一个字符串: var name = "change";name.substr();//hangconsole.log

ORA-24067: exceeded maximum number of subscribers for queue ADMIN.SMS_MT_QUEUE

临时处理办法: delete from aq$_ss_MT_tab_D;delete from aq$_ss_MT_tab_g;delete from aq$_ss_MT_tab_h;delete from aq$_ss_MT_tab_i;delete from aq$_ss_MT_tab_p;delete from aq$_ss_MT_tab_s;delete from aq$

SQLSERVER排名函数RANK,DENSE_RANK,NTILE,ROW_NUMBER

SQL SERVER排名函数RANK,DENSE_RANK,NTILE,ROW_NUMBER 前言 本文意于用实例数据帮助理解SQL SERVER排名函数RANK,DENSE_RANK,NTILE,ROW_NUMBER。 准备工作 创建测试表:   ? 1 2 3 4 5 create table test( id int identity(1,1)

[LeetCode] 137. Single Number II

题:https://leetcode.com/problems/single-number-ii/ 题目大意 给定array,其中有一个元素只出现了1次,其他元素都出现了3次。 思路 求和 减去 (set(array)*3 - array)/2 作为答案。 class Solution {public int singleNumber(int[] nums) {Set<Long> se

Oracle - ORA-01789: Query block has incorrect number of result columns

一、原因     这个错误一般是在执行表之间的相加(union),相减(minus)等SQL语句时,两个个查询块具有不一致的结果列数所导致的。 二、方案     只要将两段SQL语句的列数调整为一致就可以解决。使用union时,要注意数据库字段的格式要一致,如varchar和nvarchar是不一样的。

Java Number 类和方法

一般地,当需要使用数字的时候,我们通常使用内置数据类型,如:byte、int、long、double 等。 实例 int a = 5000;float b = 13.65;byte c = 0x4a; 然而,在实际开发过程中,我们经常会遇到需要使用对象,而不是内置数据类型的情形。为了解决这个问题,Java 语言为每一个内置数据类型提供了对应的包装类。 所有的包装类(Integer、Lo