【let code】754.到达终点的最短路长

本文探讨了等差数列求和问题及其在算法设计中的应用,通过具体实例分析了如何利用等差数列特性解决目标点到达问题,并提供了一段C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:
在这里插入图片描述
问题分析:
1.有题目第n步步长为n可联想等差数列求和;
2.由于在水平面上左右走,故左右会发生对称现象如下(且同一步数可到达位置之间存在差值为2的关系):
第一步可到达:1,-1
第二步可到达:3,1,-1
第三步可到达:6, 4, 2, 0, -2, -4, -6
第四步可到达:10, 8, 6, 4, 2, 0 …
第五步可到达:15, 13, 11, 9, 7, 5, 3, 1…
3.分析如上步数:
首先累加确定到达与目标点最近的数值需要几步;
在确定剩余步数需走几步;
4.
以8为例,累加至最近结果10,首先根据同一步数可达位置差值关系,判断当前步数差值是否为偶数(如若为偶数则表示当前步数直接可达);
以7为例,累加至最近结果为10, 不符合同步差值关系,进行下一步判断:当前步数奇偶性(也可以判断目标结果的奇偶性质),4为偶数则表示差值关系在下一步才生效,所以结果加1;
以5为例,累加至最近结果6, 不符合同步差值关系,判断当前步数奇偶性,3为奇数,则同步差值关系在两步后生效,所以结果加2;
完整代码:

int reachNumber(int target)     
{        
	int sum = 0;        
	target = abs(target);        
	for (int i = 1; ; i++)        
	{            
		sum += i;            
		if (sum == target)                
			return i;            
		else            
		{                
			if (sum > target)                
			{                    
				if (abs(sum - target) % 2 == 0)    return i;                                        
				else  if (i % 2 == 0)   return i+1;                        
				else  return i+2; 
			}                
		}            
	}
	      
	return 1;  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值