算法思想:贪心思想
个人说明:该文章只是为了让自己记忆更深,如有错误的地方还请大佬指正。
解决问题:跳跃问题(线性阈值可达问题)
首先,在可达类问题中,当可达长度超过目标长度,就可以提前得出结果。可达问题是连续的问题,如从第一个位置开始,一直遍历到最远可达。
在这个过程中,如果最远可达大于了目标距离则让程序返回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; }
算法优化
算法的基本操作是内层循环的判断语句④,如果能解决最坏情况和最坏情况且不可达的问题,算法应该能进一步优化,我暂时想不到。