贪心
数组
题目描述
给你一个下标从 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