学算法的一天

算法思想:贪心思想

个人说明:该文章只是为了让自己记忆更深,如有错误的地方还请大佬指正。

解决问题:跳跃问题(线性阈值可达问题)

首先,在可达类问题中,当可达长度超过目标长度,就可以提前得出结果。可达问题是连续的问题,如从第一个位置开始,一直遍历到最远可达。

在这个过程中,如果最远可达大于了目标距离则让程序返回true。

如果循环体正常结束,则返回false。


好情况:除了目标位置前一个位置以为的任意一个位置的最远可达位置直接大于了目标位置,或者序列长度为1,这个时候记m为问题规模,时间复杂度O(m) , 1< m < n;


最坏情况:假设最远可达是一个阈值,当突破阈值的时候,程序会结束,但是如果在n的周期内,都没有突破阈值,那么就是最坏情况,这时有可能不可达或者最后可达(即目标位置前一个位置计算后可达)。这个时候记m为问题规模,时间复杂度O(m) , m = n;


不可达:如果不可达,说明程序并没有运行一个n周期,这个时候记m为问题规模,时间复杂度O(m) , 0 < m < n;


算法如下:

bool canJump(int* nums, int numsSize){
  if (*nums > numsSize || numsSize == 1) return true;
  //越往最后一个下标靠近,越容易可达
  //算出最远可达,如果在计算期间有最远可达超过了最远下标,则可达
  int new_pos = 0;
  int max_pos = 0;
​
  for (int i = 0; i <= max_pos; i++)
  {
     new_pos = *(nums + i) + i; 
     max_pos = new_pos > max_pos ? new_pos : max_pos;
      
     if (max_pos >= numsSize - 1){return true;}    //④
  }
    
  return false;
}

算法优化

算法的基本操作是内层循环的判断语句④,如果能解决最坏情况和最坏情况且不可达的问题,算法应该能进一步优化,我暂时想不到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值