码迷,mamicode.com
首页 > 编程语言 > 详细

leetcode算法-最长和谐子序列

时间:2020-06-11 21:26:35      阅读:56      评论:0      收藏:0      [点我收藏+]

标签:while   没有   最小   长度   工作   原因   之间   span   小数   

这两天正在忙实习找工作,晚上就抽时间写写算法,放松一下子

一、题目

和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1。

现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度。

示例 1:

输入: [1,3,2,2,5,2,3,7]
输出: 5
原因: 最长的和谐数组是:[3,2,2,2,3].
说明: 输入的数组长度最大不超过20,000.

二、解题思路

此题的意思,无非就是在在排好序的数组中,找到最大值和最小值相差一的,且距离最远的两个元素,加一即可

所以,首先对数组进行排序,排序算法本人了解比较快的又相对简单的还是快速排序,所以就用快速排序先进行排序,之后采用双层循环,第一层从左到右遍历数组中的元素,第二层从右到左遍历元素,直到找出比外层循环大一的元素(没有就循环完),此时计算长度,与原来长度对比,选出最大的,跳出本次循环,直到结束。

注意:二层循环不可以从左向右循环,原因是如果最大的数有好几个相同的,就会处理着很麻烦。

三、代码:

    public static void main(String[] args) {
        int[] array = new int[] { 1, 3, 2, 2, 5, 2, 3, 7 };
        System.out.println(getHarmoniousArrayLength(array));
    }

    public static int getHarmoniousArrayLength(int[] array) {
        // 首先对数组进行有序化
        quickSort(array, 0, array.length - 1);
        // 存储最大数量
        int max = 0;
        for (int i = 0; i < array.length - 1; i++) {
            for (int j = array.length - 1; j > i; j--) {
                // 判断是否符合条件
                if (array[i] + 1 == array[j]) {
                    // 计算长度
                    int result = j - i + 1;
                    // 选出长度最大的差值
                    if (result > max) {
                        max = result;
                        break;
                    }
                }
            }
        }
        return max;

    }

    // 快速排序
    public static void quickSort(int[] array, int low, int high) {
        // 最小数组
        if (low < high) {
            int i = low;
            int j = high;
            int middle = array[low];
            // 进行判断,并且互换
            while (i < j) {
                // 寻找出左边的不合适元素
                while (i < j && array[j] >= middle) {
                    j--;
                }
                // 寻找出右边的不合适元素
                while (i < j && array[i] <= middle) {
                    i++;
                }
                if (i < j) {
                    int temp = array[i];
                    array[i] = array[j];
                    array[j] = temp;
                }
            }
            // 将基准和最后指针位置的数进行互换
            array[low] = array[j];
            array[j] = middle;
            // 将基准数左边和右边进行同样的操作
            quickSort(array, low, j - 1);
            quickSort(array, j + 1, high);
        }
    }

 

leetcode算法-最长和谐子序列

标签:while   没有   最小   长度   工作   原因   之间   span   小数   

原文地址:https://www.cnblogs.com/mcjhcnblogs/p/13096111.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!