算法记录
LeetCode 题目:
给你一个下标从 0 开始的数组 nums,数组由若干互不相同的整数组成。
nums 中有一个值最小的元素和一个值最大的元素。分别称为最小值和最大值。你的目标是从数组中移除这两个元素。
一次删除操作定义为从数组的前面移除一个元素或从数组的后面移除一个元素。
返回将数组中最小值和最大值都移除需要的最小删除次数。
说明
一、题目
输入:nums = [2,10,7,5,4,1,8,6]
输出:5
解释:
数组中的最小元素是 nums[5] ,值为 1 。
数组中的最大元素是 nums[1] ,值为 10 。
将最大值和最小值都移除需要从数组前面移除 2 个元素,从数组后面移除 3 个元素。
结果是 2 + 3 = 5 ,这是所有可能情况中的最小删除次数。
复制代码
二、分析
- 题目说需要移除最大值和最小值,那么我们就可以先把最大值和最小值的坐标求出来备用。
- 我们再来分析题目想要干啥,我们需要求取移除最大值和最小值的最小删除次数,而这个删除次数指的就是我们将当前坐标元素移除出数组所需要的次数,这个次数就是移动到头部或者是尾部的距离。
- 这样一来就是求解最大值和最小值坐标距离头部或者是尾部的最小距离了。
- 分为三种情况,一是都往头部移动,这个时候删除次数就是靠近尾部的坐标到头部的距离;二是都往尾部移动,这个时候删除次数就是靠近头部的坐标到尾部的距离;第三个就是两个数据分别向靠近的端点移动距离之和。
- 只需要返回他们三者之间的最小值即可。
class Solution {
public int minimumDeletions(int[] nums) {
if(nums.length == 1 || nums.length == 2) return nums.length;
int max = 0, min = 0, start = 0;
if(nums.length % 2 == 0) {
if(nums[0] > nums[1]) {
max = 0;
min = 1;
} else {
max = 1;
min = 0;
}
start = 2;
} else {
start = 1;
}
for(int i = start; i < nums.length; i += 2) {
if(nums[i] > nums[i + 1]) {
if(nums[i] > nums[max]) max = i;
if(nums[i + 1] < nums[min]) min = i + 1;
} else {
if(nums[i + 1] > nums[max]) max = i + 1;
if(nums[i] < nums[min]) min = i;
}
}
int left = Math.min(min, max), right = Math.max(min, max);
return Math.min(Math.min(right + 1, nums.length - left), left + 1 + nums.length - right);
}
}
复制代码
总结
求取数组中的最大值和最小值的坐标。