ภาพรวม
บทความนี้สาธิตวิธีตรวจสอบว่าอาร์เรย์เป็น Strictly Increasing (เพิ่มอย่างเคร่งครัด) หรือ Strictly Decreasing (ลดอย่างเคร่งครัด) เท่านั้น
นิยาม
- Strictly Increasing: a[i] < a[i+1] สำหรับทุก i
- Strictly Decreasing: a[i] > a[i+1] สำหรับทุก i
- ไม่รองรับ Non-decreasing (อนุญาตเท่ากันได้) หรือ Non-increasing
การนำไปใช้
const sameSlope = (a, b, c) =>
(b - a < 0 && c - b < 0) || (b - a > 0 && c - b > 0);
const increasingOrDecreasing = (arr = []) => {
if (arr.length <= 2) return true; // 0, 1, 2 元素 总是单调
for (let i = 1; i < arr.length - 1; i++) {
if (!sameSlope(arr[i-1], arr[i], arr[i+1])) {
return false;
}
}
return true;
};
console.log(increasingOrDecreasing([12, 45, 6, 4, 23, 23, 21, 1])); // false
console.log(increasingOrDecreasing([12, 45, 67, 89, 123, 144, 2656, 5657])); // true
ผลลัพธ์
false true
วิธีการที่ชัดเจนกว่า (แยก Increasing/Decreasing)
const isStrictlyMonotonic = (arr) => {
if (arr.length <= 2) return true;
let increasing = true;
let decreasing = true;
for (let i = 1; i < arr.length; i++) {
if (arr[i] <= arr[i-1]) increasing = false;
if (arr[i] >= arr[i-1]) decreasing = false;
if (!increasing && !decreasing) return false;
}
return increasing || decreasing;
};
Monotonic แบบไม่เคร่งครัด (Non-strict)
const isMonotonic = (arr) => {
if (arr.length <= 2) return true;
let increasing = true;
let decreasing = true;
for (let i = 1; i < arr.length; i++) {
if (arr[i] < arr[i-1]) increasing = false;
if (arr[i] > arr[i-1]) decreasing = false;
}
return increasing || decreasing;
};
การประยุกต์ใช้
- Time Series Analysis: Trend Detection
- Algorithm Validation: Binary Search Precondition
- Data Quality: Detect Anomalies
- Financial: Price Trend Analysis
ข้อควรระวัง
- NaN Values: การเปรียบเทียบกับ NaN จะเป็น false เสมอ
- Mixed Types: ต้องแปลงเป็น Number ก่อน
- Floating Point Precision: อาจต้องใช้ Epsilon Comparison