首页 > 其他分享 >数组小和

数组小和

时间:2022-11-08 00:23:47浏览次数:50  
标签:arr return int process static 数组

package class04;

/**
 * 数组小和
 * 在一个数组中,一个数左边比它小的数的总和,叫数的小和,所有数的小和累加起来叫数组的小和,求数组小和
 */
public class Code02_SmallSum {
    public static int smallSum(int[] arr) {
        if (arr == null || arr.length < 2) {
            return 0;
        }
        return process(arr, 0, arr.length - 1);
    }

    public static int process(int[] arr, int L, int R) {
        if (L == R) {
            return 0;
        }
        int M = L + ((R - L) >> 1);
        return process(arr, L, M)//左组产生的最小和
                + process(arr, M + 1, R)//右组产生的最小和
                + merge(arr, L, M, R);//合并产生的最小和
    }

    //合并
    private static int merge(int[] arr, int L, int M, int R) {
        int[] help = new int[R - L + 1];//定义一个help数组,长度位(R - L + 1)
        int i = 0;
        int p1 = L;
        int p2 = M + 1;
        int ans = 0;
        while (p1 <= M && p2 <= R) {
            //在给help数组赋值之前,累加ans。
            //如果arr[p1] < arr[p2],那么ans就累加上(R - p2 + 1)个arr[p1]
            //否则就累加0个arr[p1]
            ans += arr[p1] < arr[p2] ? (R - p2 + 1) * arr[p1] : 0;
            help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
        }
        while (p1 <= M) {
            help[i++] = arr[p1++];
        }
        while (p2 <= R) {
            help[i++] = arr[p2++];
        }
        for (i = 0; i < help.length; i++) {
            arr[L + i] = help[i];
        }
        return ans;//返回当前循环的merge方法中的ans。
    }

    //对数器
    //遍历每一个数,并把所有,在当前循环中的这个数左侧的,并且比这个数小的数,都相加。
    public static int comparator(int[] arr) {
        if (arr == null || arr.length < 2) {
            return 0;
        }
        int ans = 0;
        for (int i = 1; i < arr.length; i++) {
            for (int j = 0; j < i; j++) {
                ans += arr[j] < arr[i] ? arr[j] : 0;
            }
        }
        return ans;
    }

    public static int[] generatorRandomArray(int maxSize, int maxValue) {
        int[] arr = new int[(int) (Math.random() * maxSize) + 2];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * maxValue);
        }
        return arr;
    }

    public static int[] copyArray(int[] arr) {
        if (arr == null) {
            return null;
        }
        int[] res = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            res[i] = arr[i];
        }
        return res;
    }

    public static void main(String[] args) {
        int maxSize = 100;
        int maxValue = 100;
        int testTimes = 100000;
        System.out.println("test start!");
        for (int i = 0; i < testTimes; i++) {
            int[] arr0 = generatorRandomArray(maxSize, maxValue);
            int[] arr1 = copyArray(arr0);
            int[] arr2 = copyArray(arr0);
            int i1 = smallSum(arr1);
            int i2 = comparator(arr2);
            if (i1 != i2) {
                System.out.println("oops!");
                System.out.println("i1 = " + i1);
                System.out.println("i2 = " + i2);
                break;
            }
        }
        System.out.println("test end!");
    }

}

 

标签:arr,return,int,process,static,数组
From: https://www.cnblogs.com/TheFloorIsNotTooHot/p/16867964.html

相关文章

  • 数组~Count digits from a text stream
    题目描述Countdigits,whitespaces(‘’,’\n’,’\t’)andothercharactersfromatextstreamendingwithEOF.输入AtextstreamendingwithEOF输出Pr......
  • 数组~插队
    题目描述有一个按照升序已排好的9个元素的数组,今输入一个数要求按原来排序的规律将它插入数组中。输入第一行,原始数列。第二行,需要插入的数字。输出排序后的数列......
  • 数学(环形数组) 数组 技巧 字符串
    918.环形子数组的最大和intsum=0,curMax=0,max=nums[0],curMin=0,min=nums[0];for(inti:nums){curMax=Math.max(curMax+i,i);max=Math.max......
  • JavaScript之数组高阶API—reduce()
    一文搞懂JavaScript数组中最难的数组API——reduce()前面我们讲了数组的一些基本方法,今天给大家讲一下数组的reduce(),它是数组里面非常重要也是比较难的函数,那么这篇文章......
  • 将数组按照指定的顺序排序处理
    转载:https://blog.csdn.net/yang_shibiao/article/details/1249681391.数据准备建表语句:   createtabletemp(       provincestring,       city......
  • JavaScript 中最常用的数组方法整理汇总
    英文|https://javascript.plainenglish.io/20-most-used-array-methods-in-javascript-c57276982377翻译|杨小爱在JavaScript中,一个数组实例有37个内置方法,常用的方......
  • vue中改变数组对象属性名
    data:{年:2022,数量:'8000'},//把data下的年改为年份,数量改为数据量data:{年份:2022,数据量:'8000'},思路:1.遍历Json数组;2.将数组每一......
  • json格式的数组去重
    vararr=[{key:'01',value:'乐乐'},{key:'02',value:'博博'},{key:'03',value:'淘淘'},{key:'......
  • 力扣977 有序数组的平方
    有序数组的平方题目:给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。 暴力破解:O(nlogn)(1)遍历,求出每个数字......
  • 实验4 类与数组、指针
    task5.cpp#include<iostream>#include"vectorInt.hpp"voidtest(){usingnamespacestd;intn;cin>>n;vectorIntx1(n);for(autoi......