最长的可整合子数组的长度

1:题目描述

题目描述

先给出可整合数组的定义:如果一个数组在排序之后,每相邻两个数的差的绝对值都为1,或者该数组长度为1,则该数组为可整合数组。例如,[5, 3, 4, 6, 2]排序后为[2, 3, 4, 5, 6],符合每相邻两个数差的绝对值都为1,所以这个数组为可整合数组
给定一个数组arr, 请返回其中最大可整合子数组的长度。例如,[5, 5, 3, 2, 6, 4, 3]的最大可整合子数组为[5, 3, 2, 6, 4],所以请返回5
[要求]
时间复杂度为O(n^2)O(n2),空间复杂度为O(n)O(n)

输入描述:

第一行一个整数N,表示数组长度
第二行N个整数,分别表示数组内的元素

输出描述:

输出一个整数,表示最大可整合子数组的长度
示例1

输入

7 5 5 3 2 6 4 3

输出

5

2:题目分析

  很显然,最直接的方法就是先对数组排序,然后再按照目标要求的顺序进行依次便利的做判断,即可。

3:代码示例

package No2;

import sun.misc.GC;

import java.sql.Statement;
import java.util.Arrays;
import java.util.Scanner;

/**
 * @author :dazhu
 * @date :Created in 2020/3/26 11:55
 * @description:最长的可整合子数组的长度
 * @modified By:
 * @version: $
 */
//思路。排序后,一一对比,寻找最长可整合子数组
public class Main {
    public static void main(String[]args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[]arr = new int[n];

        for(int i=0;i<n;i++){
            arr[i] = sc.nextInt();
        }

        //先排序
        int index = 0;
        for(int i=0;i<arr.length;i++){
            index = i;
            for(int j=i;j<arr.length;j++){
                if(arr[j]<arr[index]){
                    index = j;
                }
            }
            swap(arr,index,i);
        }

        //排序完成后,直接查找最长的可整合子数组
        int counter =0;
        int lastCounter = 0;
        int startIndex = 0;
        for(int k=0;k<arr.length-1;k++){
            //初始化本次判断
            counter = 1;
            startIndex = k;
            //进行可整合的判断
            while(true){
                //如果超过范围直接break
                if(startIndex>=arr.length-1){
                    break;
                }
                //如果排序后,有重复内容,则要做去重判断
                if(arr[startIndex]==arr[startIndex+1]){
                    startIndex++;
                }
                //如果满足可整合条件,则继续判断
                if(Math.abs(arr[startIndex]-arr[startIndex+1])==1){
                    startIndex++;
                    counter++;
                }
                else{//一旦不满足,就break
                    break;
                }
            }
            //如此此时长度大于上次的,则更新即可
            if(counter> lastCounter){
                lastCounter = counter;
            }
        }
        System.out.println(lastCounter);
    }

    //交换方法
    public static void swap(int[]arr,int i,int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j]  =temp;
    }
}

 

posted @ 2020-03-26 12:38  大朱123  阅读(473)  评论(0编辑  收藏  举报