2020.7.22 力扣每日

Posted -tty

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2020.7.22 力扣每日相关的知识,希望对你有一定的参考价值。

技术图片

 

 1 class Solution {
 2     public int minArray(int[] numbers) {
 3         int left = 0, right = numbers.length - 1;
 4         while(left < right){
 5             int mid = (right - left) / 2 + left;
 6             if(numbers[mid] < numbers[right]){    
 7                 right = mid;
 8             }
 9             else if(numbers[mid] > numbers[right]){
10                     left = mid + 1;
11                  }
12             else --right;
13         }
14         return numbers[left];
15     }
16 }

解题思路:

   对于该题,暴力法即顺序查找的思路及其简单,即找到第一个小于前一个值的元素,将其返回即可。但这样的时间复杂度为O(N),并不推荐。所以此处考虑更优的查找方法,二分查找,降低时间复杂度。首先分析题目,对于二分查找来说,nums[left],nums[right],nums[mid]的情况必须全部分析清楚,根据不同的情况,移动left,right指针,来返回即可。

   若题目的所给数组无重复数字,假设最终返回元素的节点为i,由于无重复元素,则必定[left,i-1]的值都大于[i,right]的值,所以比较时,若nums[mid] > nums[right],则移动left,left = mid +1,若nums[mid] < nums[right] 则移动right,right = mid。最终返回nums[left]即可。

注意点:

   但该题中并未标明无重复元素,需考虑第三种情况nums[mid] == nums[right]。对于该情况,我们无法确定mid是处于[left,i]之间还是[i,right]之间,但无论如何,对于i处的元素来说,nums[i]只可能小于或等于nums[right],但无论如何都一定出现在right左侧,所以此处使用--right,使right指针前移。

时间复杂度:O(logn)

空间复杂度:O(n)

题后总结:

   优:使用了二分查找优化了算法

   差:对于情况的考虑不够周到,还需多多练习

以上是关于2020.7.22 力扣每日的主要内容,如果未能解决你的问题,请参考以下文章

[6]力扣每日一题

[7]力扣每日一题

[7]力扣每日一题

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

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

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