码迷,mamicode.com
首页 > 其他好文 > 详细

2020.7.31 力扣每日

时间:2020-08-01 00:12:16      阅读:89      评论:0      收藏:0      [点我收藏+]

标签:dma   mamicode   ima   不难   inf   解题思路   使用   题解   比较   

技术图片

 

 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 力扣每日

标签:dma   mamicode   ima   不难   inf   解题思路   使用   题解   比较   

原文地址:https://www.cnblogs.com/-TTY/p/13412684.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!