力扣1502. 判断能否形成等差数列(Array数组详解)

来源:1502. 判断能否形成等差数列 - 力扣(LeetCode)

题目

给你一个数字数组 arr 。

如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。

如果可以重新排列数组形成等差数列,请返回 true ;否则,返回 false 。

示例 1:

输入:arr = [3,5,1]
输出:true
解释:对数组重新排序得到 [1,3,5] 或者 [5,3,1] ,任意相邻两项的差分别为 2 或 -2 ,可以形成等差数列。

示例 2:

输入:arr = [1,2,4]
输出:false
解释:无法通过重新排序得到等差数列。

提示:

  • 2 <= arr.length <= 1000
  • -10^6 <= arr[i] <= 10^6

详解 

思路

此题非常简单,只需将数组排序,再计算一个公差即可判断是否为等差数列 

class Solution {
    public boolean canMakeArithmeticProgression(int[] arr) {
        //对数组进行sort排列
        Arrays.sort(arr);
        int diff = arr[1] - arr[0];
        for (int i = 2; i < arr.length; i++) {
            if (arr[i] - arr[i - 1] != diff) {
                return false;
            }
        }
        return true;
    }
}

 Arrays工具类(常用方法详解)

Arrays类提供了许多用于操作数组的静态方法。以下是一些常见的方法及其示例:

1. 排序
  • sort(T[] a): 对数组进行升序排序。

    int[] arr = {5, 2, 8, 3, 1};
    Arrays.sort(arr);
    System.out.println(Arrays.toString(arr)); // 输出: [1, 2, 3, 5, 8]
    
  • sort(T[] a, Comparator<? super T> c): 根据指定的比较器对数组进行排序。

    String[] names = {"Alice", "Bob", "Charlie"};
    Arrays.sort(names, Comparator.comparingInt(String::length));
    System.out.println(Arrays.toString(names)); // 输出: [Bob, Alice, Charlie]
    
  • parallelSort(T[] a): 使用并行排序对数组进行升序排序。

    int[] arr = {5, 2, 8, 3, 1};
    Arrays.parallelSort(arr);
    System.out.println(Arrays.toString(arr)); // 输出: [1, 2, 3, 5, 8]
    
2. 搜索
  • binarySearch(T[] a, T key): 使用二分搜索在升序数组中搜索指定的元素。

    int[] arr = {1, 2, 3, 5, 8};
    int index = Arrays.binarySearch(arr, 3);
    System.out.println(index); // 输出: 2
    
  • binarySearch(T[] a, T key, Comparator<? super T> c): 使用二分搜索在升序数组中搜索指定的元素,使用指定的比较器。

    String[] names = {"Alice", "Bob", "Charlie"};
    int index = Arrays.binarySearch(names, "Bob", Comparator.naturalOrder());
    System.out.println(index); // 输出: 1
    
3. 复制
  • copyOf(T[] original, int newLength): 复制指定的数组,返回一个新数组,长度为newLength

    int[] arr = {1, 2, 3, 4, 5};
    int[] newArr = Arrays.copyOf(arr, 3);
    System.out.println(Arrays.toString(newArr)); // 输出: [1, 2, 3]
    
  • copyOfRange(T[] original, int from, int to): 复制指定范围的数组,返回一个新数组。

    int[] arr = {1, 2, 3, 4, 5};
    int[] newArr = Arrays.copyOfRange(arr, 1, 4);
    System.out.println(Arrays.toString(newArr)); // 输出: [2, 3, 4]
    
4. 转换
  • asList(T... a): 返回一个由指定数组支持的固定大小的列表。

    String[] names = {"Alice", "Bob", "Charlie"};
    List<String> list = Arrays.asList(names);
    System.out.println(list); // 输出: [Alice, Bob, Charlie]
    
  • toString(T[] a): 返回数组的字符串表示形式。

    int[] arr = {1, 2, 3, 4, 5};
    String str = Arrays.toString(arr);
    System.out.println(str); // 输出: [1, 2, 3, 4, 5]
    
5. 填充
  • fill(T[] a, T val): 用指定的值填充整个数组。

    int[] arr = new int[5];
    Arrays.fill(arr, 7);
    System.out.println(Arrays.toString(arr)); // 输出: [7, 7, 7, 7, 7]
    
  • fill(T[] a, int fromIndex, int toIndex, T val): 用指定的值填充数组的指定范围。

    int[] arr = {1, 2, 3, 4, 5};
    Arrays.fill(arr, 1, 4, 0);
    System.out.println(Arrays.toString(arr)); // 输出: [1, 0, 0, 0, 5]
    
6. 其他
  • equals(T[] a, T[] a2): 比较两个数组是否相等。

    int[] arr1 = {1, 2, 3};
    int[] arr2 = {1, 2, 3};
    boolean isEqual = Arrays.equals(arr1, arr2);
    System.out.println(isEqual); // 输出: true
    
  • hashCode(T[] a): 返回数组的哈希码。

    int[] arr = {1, 2, 3};
    int hashCode = Arrays.hashCode(arr);
    System.out.println(hashCode); // 输出: 哈希码
    
  • stream(T[] a): 返回一个顺序流,其元素是数组的元素。

    int[] arr = {1, 2, 3, 4, 5};
    IntStream stream = Arrays.stream(arr);
    stream.forEach(System.out::println); // 输出: 1 2 3 4 5
    
7. 升序排序
  • sort(int[] a): 对整数数组进行升序排序。

    int[] arr = {5, 2, 8, 3, 1};
    Arrays.sort(arr);
    System.out.println(Arrays.toString(arr)); // 输出: [1, 2, 3, 5, 8]
    
  • binarySearch(int[] a, int key): 使用二分搜索在升序数组中搜索指定的元素。

    int[] arr = {1, 2, 3, 5, 8};
    int index = Arrays.binarySearch(arr, 3);
    System.out.println(index); // 输出: 2
8.降序排序
  • Array.sort(arr,Comparator.reverseOrder()):结合自定义的比较器。
Integer[] arr = {5, 2, 8, 3, 1};
        
        // 使用自定义比较器进行降序排序
        Arrays.sort(arr, Comparator.reverseOrder());
        
        System.out.println(Arrays.toString(arr)); // 输出: [8, 5, 3, 2, 1]

需要注意的是,Comparator.reverseOrder()适用于对象数组(如Integer[]),而不适用于基本数据类型数组(如int[])。如果你使用的是基本数据类型数组,可以先将其转换为对象数组,排序后再转回基本数据类型数组,或者使用Java 8的流(Stream)API来实现降序排序。

以下是使用流API对基本数据类型数组进行降序排序的示例:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] arr = {5, 2, 8, 3, 1};
        
        // 使用流API进行降序排序
        arr = Arrays.stream(arr)
                    .boxed()
                    .sorted(Comparator.reverseOrder())
                    .mapToInt(Integer::intValue)
                    .toArray();
        
        System.out.println(Arrays.toString(arr)); // 输出: [8, 5, 3, 2, 1]
    }
}

  在这个示例中,我们首先将int[]数组转换为IntStream,然后使用boxed()方法将其转换为Stream<Integer>,接着使用sorted(Comparator.reverseOrder())进行降序排序,最后再通过mapToInt(Integer::intValue)toArray()方法将其转换回int[]数组。

9. 填充多维数组
  • fill(T[][] a, T val): 用指定的值填充整个二维数组。
    int[][] matrix = new int[3][3];
    Arrays.fill(matrix, 7);
    for (int[] row : matrix) {
        System.out.println(Arrays.toString(row)); 
        // 输出: [7, 7, 7]
        //       [7, 7, 7]
        //       [7, 7, 7]
    }
    
10. 排序多维数组
  • sort(T[][] a): 对二维数组的每个子数组进行排序。
    int[][] matrix = {{5, 2, 8}, {3, 1, 4}, {7, 6, 9}};
    for (int[] row : matrix) {
        Arrays.sort(row);
    }
    for (int[] row : matrix) {
        System.out.println(Arrays.toString(row)); 
        // 输出: [2, 5, 8]
        //       [1, 3, 4]
        //       [6, 7, 9]
    }
    
11. 检查数组是否包含某个元素
  • binarySearch(T[] a, T key): 检查数组是否包含某个元素(需先排序)。
    int[] arr = {1, 2, 3, 4, 5};
    boolean contains = Arrays.binarySearch(arr, 3) >= 0;
    System.out.println(contains); // 输出: true
    
12. 使用流进行复杂操作
  • stream(T[] a): 使用流进行复杂操作,例如过滤、映射、归约等。
    int[] arr = {1, 2, 3, 4, 5};
    int sum = Arrays.stream(arr).filter(n -> n % 2 != 0).sum();
    System.out.println(sum); // 输出: 9 (奇数之和)
    
13. 并行流操作
  • parallelStream(T[] a): 使用并行流进行高效处理。
    int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int sum = Arrays.parallelStream(arr).map(n -> n * 2).sum();
    System.out.println(sum); // 输出: 110 (每个元素乘以2后求和)
    
14. 数组转换为集合
  • asList(T... a): 将数组转换为列表,然后进行集合操作。
    String[] names = {"Alice", "Bob", "Charlie"};
    List<String> list = Arrays.asList(names);
    list.add("David"); // 抛出 UnsupportedOperationException,因为 asList 返回的是固定大小的列表
    
15. 使用setAllreplaceAll
  • setAll(T[] a, IntFunction<T> generator): 使用生成器函数设置数组的所有元素。

    int[] arr = new int[5];
    Arrays.setAll(arr, i -> i * i);
    System.out.println(Arrays.toString(arr)); // 输出: [0, 1, 4, 9, 16]
    
  • replaceAll(T[] a, UnaryOperator<T> operator): 使用操作符替换数组的所有元素。

    int[] arr = {1, 2, 3, 4, 5};
    Arrays.replaceAll(arr, n -> n * 2);
    System.out.println(Arrays.toString(arr)); // 输出: [2, 4, 6, 8, 10]
    
16. 使用copyOfcopyOfRange处理多维数组
  • copyOf(T[][] original, int newLength): 复制二维数组。

    int[][] matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    int[][] newMatrix = Arrays.copyOf(matrix, 2);
    for (int[] row : newMatrix) {
        System.out.println(Arrays.toString(row)); 
        // 输出: [1, 2, 3]
        //       [4, 5, 6]
    }
    
  • copyOfRange(T[][] original, int from, int to): 复制二维数组的指定范围。

    int[][] matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    int[][] newMatrix = Arrays.copyOfRange(matrix, 1, 3);
    for (int[] row : newMatrix) {
        System.out.println(Arrays.toString(row)); 
        // 输出: [4, 5, 6]
        //       [7, 8, 9]
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值