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 力扣每日的主要内容,如果未能解决你的问题,请参考以下文章

[6]力扣每日一题

[7]力扣每日一题

[7]力扣每日一题

力扣 每日一题 811. 子域名访问计数难度:中等

力扣 每日一题 934. 最短的桥难度:中等,rating: 1825(dfs / bfs)

力扣每日一题:993. 二叉树的堂兄弟节点(简单)