• 有序数组的平方


    977. 有序数组的平方

    package 数组;
    
    import java.util.Arrays;
    
    public class 有序数组的平方 {
    
        public static void main(String[] args) {
    //        int[] arr = {-4, -1, 0, 3, 10};
            int[] arr = {1};
            有序数组的平方 a = new 有序数组的平方();
            int[] ints = a.sortedSquares(arr);
            System.out.println(Arrays.toString(ints));
        }
    
    
        // 找到数组的正负值得分界线
        // 正值的平方还是非递减的
        // 负值的平方是非递增的
        // 合并这两块单调区域
        public int[] sortedSquares(int[] nums) {
            if (nums == null || nums.length == 0) {
                return null;
            }
            int[] result = new int[nums.length];
            // 全是正数,直接返回平方
            // 全是负数,平方翻转
            // 有正有负,单独处理
            if (nums[0] >= 0) {
                for (int i = 0; i < nums.length; i++) {
                    result[i] = nums[i]*nums[i];
                }
            } else if (nums[nums.length - 1] <= 0) {
                for (int i = 0; i < nums.length; i++) {
                    result[i] = nums[nums.length - 1 - i]*nums[nums.length - 1 - i];
                }
            } else {
                int dividIndex = getDividIndex(nums);
                square(nums, result, 0, dividIndex - 1);
                square(nums, result, dividIndex, nums.length - 1);
                result = merge(result, dividIndex);
            }
            return result;
        }
    
        // 第一个大于等于0的数的索引就是分界线,正数的起点是分界线
        public int getDividIndex(int[] nums) {
            for (int i = 0; i < nums.length; i++) {
                if (nums[i] >= 0) {
                    return i;
                }
            }
            return -1;
        }
    
        public void square(int[] nums, int[] result, int start, int end) {
            for (int i = start; i <= end; i++) {
                result[i] = nums[i] * nums[i];
            }
        }
    
        // 合并数组的两块有序区域 {6,4,2,1,5,7}
        public int[] merge(int[] result, int dividIndex) {
            int [] merged=new int[result.length];
            int left = dividIndex-1;
            int right = dividIndex;
            int i = 0;
            while (left >= 0 && right <= result.length-1) {
                if (result[left] <= result[right]) {
                    merged[i++] = result[left--];
                } else if (result[left] > result[right]) {
                    merged[i++] = result[right++];
                }
            }
            while (left >=0) {
                merged[i++] = result[left--];
            }
            while (right <= result.length - 1) {
                merged[i++] = result[right++];
            }
            return merged;
        }
    
    }

    。。

  • 相关阅读:
    十个 PHP 开发者最容易犯的错误
    PHP 引用是个坑,请慎用
    Laravel 模型事件入门
    PHP 设计模式阅读清单
    《PHP 设计模式》翻译完毕
    数据库分库分表(sharding)系列(一) 拆分规则
    数据库Sharding的基本思想和切分策略
    学习JVM GarbageCollection
    数据库为什么要分库分表
    vue2.0 父子组件通信 兄弟组件通信
  • 原文地址:https://www.cnblogs.com/guoyu1/p/15350144.html
Copyright © 2020-2023  润新知