这是我参与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;
}
}