题目: 从数组中移除最大值和最小值

来自智得网
跳转至: 导航、​ 搜索

方法一:排序法

首先,对给定的数组进行排序,然后去除排序后的数组中的第一个和最后一个元素,即最小值和最大值,得到新的数组。

#include <vector>
#include <algorithm>

std::vector<int> removeMinMax(std::vector<int>& nums) {
    std::sort(nums.begin(), nums.end());
    nums.erase(nums.begin());
    nums.pop_back();
    return nums;
}
import java.util.Arrays;

public int[] removeMinMax(int[] nums) {
    Arrays.sort(nums);
    return Arrays.copyOfRange(nums, 1, nums.length - 1);
}
import "sort"

func removeMinMax(nums []int) []int {
    sort.Ints(nums)
    return nums[1 : len(nums)-1]
}
def removeMinMax(nums):
    nums.sort()
    return nums[1:-1]
function removeMinMax(nums) {
    nums.sort((a, b) => a - b);
    nums.shift();
    nums.pop();
    return nums;
}

方法二:线性扫描法

在遍历数组的过程中,记录当前数组的最小值和最大值,然后创建一个新的数组,将不是最小值和最大值的元素添加到新数组中。

#include <vector>
#include <algorithm>

std::vector<int> removeMinMax(std::vector<int>& nums) {
    int minVal = INT_MAX;
    int maxVal = INT_MIN;
    for (int num : nums) {
        minVal = std::min(minVal, num);
        maxVal = std::max(maxVal, num);
    }
    
    std::vector<int> result;
    for (int num : nums) {
        if (num != minVal && num != maxVal) {
            result.push_back(num);
        }
    }
    
    return result;
}
import java.util.ArrayList;
import java.util.List;

public int[] removeMinMax(int[] nums) {
    int minVal = Integer.MAX_VALUE;
    int maxVal = Integer.MIN_VALUE;
    for (int num : nums) {
        minVal = Math.min(minVal, num);
        maxVal = Math.max(maxVal, num);
    }
    
    List<Integer> result = new ArrayList<>();
    for (int num : nums) {
        if (num != minVal && num != maxVal) {
            result.add(num);
        }
    }
    
    return result.stream().mapToInt(Integer::intValue).toArray();
}
func removeMinMax(nums []int) []int {
    minVal := int(^uint(0) >> 1)
    maxVal := -minVal - 1
    for _, num := range nums {
        if num < minVal {
            minVal = num
        }
        if num > maxVal {
            maxVal = num
        }
    }
    
    var result []int
    for _, num := range nums {
        if num != minVal && num != maxVal {
            result = append(result, num)
        }
    }
    
    return result
}
def removeMinMax(nums):
    minVal = float('inf')
    maxVal = float('-inf')
    for num in nums:
        minVal = min(minVal, num)
        maxVal = max(maxVal, num)
    
    result = []
    for num in nums:
        if num != minVal and num != maxVal:
            result.append(num)
    
    return result
function removeMinMax(nums) {
    let minVal = Number.POSITIVE_INFINITY;
    let maxVal = Number.NEGATIVE_INFINITY;
    for (let num of nums) {
        minVal = Math.min(minVal, num);
        maxVal = Math.max(maxVal, num);
    }
    
    let result = [];
    for (let num of nums) {
        if (num !== minVal && num !== maxVal) {
            result.push(num);
        }
    }
    
    return result;
}

方法三:双指针法

使用两个指针,一个指向数组的最小值,另一个指向数组的最大值。遍历数组,将不是最小值和最大值的元素移动到数组的前部分。

#include <vector>
#include <algorithm>

std::vector<int> removeMinMax(std::vector<int>& nums) {
    int minVal = INT_MAX;
    int maxVal = INT_MIN;
    for (int num : nums) {
        minVal = std::min(minVal, num);
        maxVal = std::max(maxVal, num);
    }
    
    nums.erase(std::remove(nums.begin(), nums.end(), minVal), nums.end());
    nums.erase(std::remove(nums.begin(), nums.end(), maxVal), nums.end());
    
    return nums;
}
import java.util.ArrayList;
import java.util.List;

public int[] removeMinMax(int[] nums) {
    int minVal = Integer.MAX_VALUE;
    int maxVal = Integer.MIN_VALUE;
    for (int num : nums) {
        minVal = Math.min(minVal, num);
        maxVal = Math.max(maxVal, num);
    }
    
    List<Integer> list = new ArrayList<>();
    for (int num : nums) {
        if (num != minVal && num != maxVal) {
            list.add(num);
        }
    }
    
    int[] result = new int[list.size()];
    for (int i = 0; i < list.size(); i++) {
        result[i] = list.get(i);
    }
    
    return result;
}
func removeMinMax(nums []int) []int {
    minVal := int(^uint(0) >> 1)
    maxVal := -minVal - 1
    for _, num := range nums {
        if num < minVal {
            minVal = num
        }
        if num > maxVal {
            maxVal = num
        }
    }
    
    var result []int
    for _, num := range nums {
        if num != minVal && num != maxVal {
            result = append(result, num)
        }
    }
    
    return result
}
def removeMinMax(nums):
    minVal = float('inf')
    maxVal = float('-inf')
    for num in nums:
        minVal = min(minVal, num)
        maxVal = max(maxVal, num)
    
    nums = [num for num in nums if num != minVal and num != maxVal]
    
    return nums
function removeMinMax(nums) {
    let minVal = Number.POSITIVE_INFINITY;
    let maxVal = Number.NEGATIVE_INFINITY;
    for (let num of nums) {
        minVal = Math.min(minVal, num);
        maxVal = Math.max(maxVal, num);
    }
    
    nums = nums.filter(num => num !== minVal && num !== maxVal);
    
    return nums;
}