2020.7.31 力扣每日
Posted -tty
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2020.7.31 力扣每日相关的知识,希望对你有一定的参考价值。
1 class Solution { 2 public int findMagicIndex(int[] nums) { 3 int len = nums.length; 4 for (int i = 0; i < len; i++){ 5 if (i == nums[i]) 6 return i; 7 } 8 return -1; 9 } 10 }
解题思路:
对于此类数组中查找目标值的题目,一般都可利用暴力法,顺序查找,返回题解。但此种方法一般耗时较长,需要进行优化。而一般顺序查找的题都可替换成二分查找来优化,但在此题中,由于数组中存在重复元素,也就是说当nums[mid] > i,时我们并不能直接将题解框定在左半部分;同样,即使nums[mid] < i,也无法确定魔术索引的位置。仍需遍历所有的情况。所以该题并不适合使用二分查找进行优化。
时间复杂度:O(N),N为数组长度
空间复杂度:O(1)
优化:
在顺序遍历时不难发现,即使可能存在重复元素,我们仍然会进行一些多余操作,例如{3,3,3,3}该数组中,1,2索引处的3都是多余的,因为0处的3已经大于了1,2了,所以魔术索引只可能从3处开始出现。也就是对于i处元素来说,小于nums[i]的索引都不可能成为魔术索引。根据这个发现,进行如下优化。
1 class Solution { 2 public int findMagicIndex(int[] nums) { 3 int len = nums.length; 4 for (int i = 0; i < len; i++){ 5 if (i == nums[i]) //找到魔术索引返回 6 return i; 7 if (i < nums[i]) //跳过不可能的索引 8 i = nums[i] - 1; 9 } 10 return -1; 11 } 12 }
注意点:
由于进行跳跃操作时,下一次进行比较时i应该在nums[i]处,但是由于for循环会进行+1操作,所以i的赋值应该为nums[i] - 1。
时间复杂度:O(N),最坏情况数组为每次+1的递增数列
空间复杂度:O(1)
以上是关于2020.7.31 力扣每日的主要内容,如果未能解决你的问题,请参考以下文章