303. 区域和检索 - 数组不可变 and 896. 单调数列

132 阅读1分钟

这是我参与8月更文挑战的第29天,活动详情查看:8月更文挑战

303. 区域和检索 - 数组不可变

给定一个整数数组 nums,求出数组从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点。

实现 NumArray 类:

  • NumArray(int[] nums) 使用数组 nums 初始化对象
  • int sumRange(int i, int j) 返回数组 nums 从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点(也就是 sum(nums[i], nums[i + 1], ... , nums[j]))

示例:

输入:
["NumArray", "sumRange", "sumRange", "sumRange"]
[[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]]
输出:
[null, 1, -1, -3]

解释:
NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]);
numArray.sumRange(0, 2); // return 1 ((-2) + 0 + 3)
numArray.sumRange(2, 5); // return -1 (3 + (-5) + 2 + (-1)) 
numArray.sumRange(0, 5); // return -3 ((-2) + 0 + 3 + (-5) + 2 + (-1))

代码

    class NumArray {

        int[] temp;
        public NumArray(int[] nums) {//使用数组 nums 初始化对象

            temp=nums;
        }

        public int sumRange(int i, int j) {//直接计算元素

            int sum=0;
            while (i<=j)
                sum+=temp[i++];
            return sum;
        }
    }

/**
 * Your NumArray object will be instantiated and called as such:
 * NumArray obj = new NumArray(nums);
 * int param_1 = obj.sumRange(i,j);
 */

896. 单调数列

如果数组是单调递增或单调递减的,那么它是单调的。

如果对于所有 i <= j,A[i] <= A[j],那么数组 A 是单调递增的。 如果对于所有 i <= j,A[i]> = A[j],那么数组 A 是单调递减的。

当给定的数组 A 是单调数组时返回 true,否则返回 false。

示例 1:

输入:[1,2,2,3] 输出:true

解题思路

找出第一个逆序对,确定数组应该是升序还是降序,然后根据这个单调性进行后续的判断

代码

class Solution {
    public boolean isMonotonic(int[] A) {

        int j=1;
        while (j<A.length&&A[j]==A[j-1]) j++;//过滤前面相等的子数组         
       if(j==A.length) return true;
        boolean up=A[j]-A[j-1]>0;//找出第一个不相等的数对,确定数组应该是升序还是降序
        for (;j<A.length;j++) {
            if (A[j] == A[j - 1]) continue;
            if (up) {//找出不符合的数对
                if (A[j] - A[j - 1] < 0) return false;
            } else {
                if (A[j] - A[j - 1] > 0) return false;
            }
        }
        return true;
    }
}