一道简单算法(使用快排)

题目是:

 有一个无序数组,然后另外给定一个值n,输出数组中 相加大于n的 最少元素个数。

    如数组为[2,4,4,7,7,8,9] ,n值为11,那8+9>11,最终结果为2.

package com.other;

import java.util.ArrayList;
import java.util.List;

/**
 * 一个无序数组,给定一个n,输出数组中 相加大于n的 最少元素个数
 *
 * @author kimtian
 */
public class Main {

    public static void main(String[] args) {
        Main main = new Main();
        int a[] = main.getArray();
        int length = a.length;
        /**
         * 将生成的数组进行快速排序
         **/
        main.fastSort(a);
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + ",");
        }
        /**
         * 生成一个值为1000以内的随机数n
         */
        int n = (int) (Math.random() * 30);
        System.out.println();
        System.out.println("n值为:" + n);
        int sum = 0;
        /**
         * 因为我排序选的是从小到大,所以从最大值最后一个开始取,和n相比,再用数组长度-i,即为相加超过n值的最少个数
         **/
        for (int i = length - 1; i >= 0; i--) {
            sum += a[i];
            if (sum >= n) {
                System.out.println("结果:" + (length - i));
                break;
            }
            if (i == 0 && sum < n) {
                System.out.println("数组中有" + length + "个元素,全部元素相加之和为" + sum + "。无法大于n值。");
            }
        }
    }

    public int[] getArray() {
        /**
         * 生成一个长度100以内随机,
         * 值为100以内随机数的数组
         */
        List<Integer> numList = new ArrayList();
        int length = (int) (Math.random() * 10);
        while(length==0){
            length = (int) (Math.random() * 10);
        }
        System.out.println("数组长度为:" + length);
        System.out.println();
        for (int i = 0; i < length; i++) {
            numList.add((int) (Math.random() * 10));
        }
        int a[] = new int[length];
        //将list的值放到数组中
        if (numList != null && numList.size() > 0) {
            for (int i = 0; i < length; i++) {
                a[i] = numList.get(i);
            }
        }
        return a;
    }

    /**
     * 快速排序
     *
     * @param a 数组
     */
    public void fastSort(int a[]) {
        sort(a, 0, a.length - 1);
    }

    public static void sort(int a[], int low, int hight) {
        int i, j, index;
        if (low > hight) {
            return;
        }
        i = low;
        j = hight;
        index = a[i];
        while (i < j) {
            while (i < j && a[j] >= index) {
                j--;
            }
            if (i < j) {
                a[i++] = a[j];
            }
            while (i < j && a[i] < index) {
                i++;
            }
            if (i < j) {
                a[j--] = a[i];
            }
        }
        a[i] = index;
        sort(a, low, i - 1);
        sort(a, i + 1, hight);
    }
}

猜你喜欢

转载自blog.csdn.net/third_/article/details/85125181