数组 
      
    
      
      
      
        贪心 
      
    
   
  
    
      
       
     
  
  
    
      
    
    
      
       
     
  
    
题目描述 
给你一个下标从 0  开始的数组 nums ,数组由若干 互不相同  的整数组成。
nums 中有一个值最小的元素和一个值最大的元素。分别称为 最小值  和 最大值  。你的目标是从数组中移除这两个元素。
一次 删除  操作定义为从数组的 前面  移除一个元素或从数组的 后面  移除一个元素。
返回将数组中最小值和最大值 都  移除需要的最小删除次数。
 
示例 1: 
输入: nums = [2,10  ,7,5,4,1  ,8,6]
输出: 5
解释: 
数组中的最小元素是 nums[5] ,值为 1 。
数组中的最大元素是 nums[1] ,值为 10 。
将最大值和最小值都移除需要从数组前面移除 2 个元素,从数组后面移除 3 个元素。
结果是 2 + 3 = 5 ,这是所有可能情况中的最小删除次数。
 
示例 2: 
输入: nums = [0,-4  ,19  ,1,8,-2,-3,5]
输出: 3
解释: 
数组中的最小元素是 nums[1] ,值为 -4 。
数组中的最大元素是 nums[2] ,值为 19 。
将最大值和最小值都移除需要从数组前面移除 3 个元素。
结果是 3 ,这是所有可能情况中的最小删除次数。 
 
示例 3: 
输入: nums = [101  ]
输出: 1
解释: 
数组中只有这一个元素,那么它既是数组中的最小值又是数组中的最大值。
移除它只需要 1 次删除操作。
 
 
提示: 
    1 <= nums.length <= 105  
    -105  <= nums[i] <= 105  
    nums 中的整数 互不相同  
 
解法 
方法一 
Python3 Java C++ Go TypeScript 
class   Solution : 
    def   minimumDeletions ( self ,  nums :  List [ int ])  ->  int : 
        mi  =  mx  =  0 
        for  i ,  num  in  enumerate ( nums ): 
            if  num  <  nums [ mi ]: 
                mi  =  i 
            if  num  >  nums [ mx ]: 
                mx  =  i 
        if  mi  >  mx : 
            mi ,  mx  =  mx ,  mi 
        return  min ( mx  +  1 ,  len ( nums )  -  mi ,  mi  +  1  +  len ( nums )  -  mx ) 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 class  Solution   { 
     public   int   minimumDeletions ( int []   nums )   { 
         int   mi   =   0 ,   mx   =   0 ,   n   =   nums . length ; 
         for   ( int   i   =   0 ;   i   <   n ;   ++ i )   { 
             if   ( nums [ i ]   <   nums [ mi ] )   { 
                 mi   =   i ; 
             } 
             if   ( nums [ i ]   >   nums [ mx ] )   { 
                 mx   =   i ; 
             } 
         } 
         if   ( mi   >   mx )   { 
             int   t   =   mx ; 
             mx   =   mi ; 
             mi   =   t ; 
         } 
         return   Math . min ( Math . min ( mx   +   1 ,   n   -   mi ),   mi   +   1   +   n   -   mx ); 
     } 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 class   Solution   { 
public : 
     int   minimumDeletions ( vector < int >&   nums )   { 
         int   mi   =   0 ,   mx   =   0 ,   n   =   nums . size (); 
         for   ( int   i   =   0 ;   i   <   n ;   ++ i )   { 
             if   ( nums [ i ]   <   nums [ mi ])   mi   =   i ; 
             if   ( nums [ i ]   >   nums [ mx ])   mx   =   i ; 
         } 
         if   ( mi   >   mx )   { 
             int   t   =   mi ; 
             mi   =   mx ; 
             mx   =   t ; 
         } 
         return   min ( min ( mx   +   1 ,   n   -   mi ),   mi   +   1   +   n   -   mx ); 
     } 
}; 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 func   minimumDeletions ( nums   [] int )   int   { 
     mi ,   mx ,   n   :=   0 ,   0 ,   len ( nums ) 
     for   i ,   num   :=   range   nums   { 
         if   num   <   nums [ mi ]   { 
             mi   =   i 
         } 
         if   num   >   nums [ mx ]   { 
             mx   =   i 
         } 
     } 
     if   mi   >   mx   { 
         mi ,   mx   =   mx ,   mi 
     } 
     return   min ( min ( mx + 1 ,   n - mi ),   mi + 1 + n - mx ) 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 function   minimumDeletions ( nums :   number []) :   number   { 
     const   n   =   nums . length ; 
     if   ( n   ==   1 )   return   1 ; 
     let   i   =   nums . indexOf ( Math . min (... nums )); 
     let   j   =   nums . indexOf ( Math . max (... nums )); 
     let   left   =   Math . min ( i ,   j ); 
     let   right   =   Math . max ( i ,   j ); 
     // 左右 left + 1 + n - right 
     // 两个都是左边 left + 1 + right - left = right + 1 
     // 都是右边 n - right + right - left = n - left 
     return   Math . min ( left   +   1   +   n   -   right ,   right   +   1 ,   n   -   left ); 
} 
 
 
 
 
  
  
  
    
    
    
    
      
  
    
      
  
     
   
  GitHub