按降序排列的数组数字的上限和下限(Java)

问题描述 投票:0回答:1

这是我编写的用于查找数字的上限和下限的程序。

public class BinarySearchAlgorithm {
    public static void main(String[] args) {
        int[] arr = {10, 9, 8, 7, 4, 3, 2, 1};
        int target = 6;
        System.out.println(ceilingOfNumber(arr, target));
        System.out.println(floorOfNumber(arr, target));
    }
    
    static int ceilingOfNumber(int[] arr, int target) {
        int start = 0;
        int end = arr.length -1;
        boolean isAscending = arr[start] < arr[end];

        while (start <= end) {
            int mid = start + (end - start) / 2;

            if (target == arr[mid]) {
                return mid;
            }

            if (isAscending) {
                if (target > arr[mid]) {
                    start = mid + 1;
                } else {
                    end = mid -1;
                }
            } else {
                if (target > arr[mid]) {
                    end = mid - 1;
                } else {
                    start = mid + 1;
                }
            }
        }

        return start;
    }

    static int floorOfNumber(int[] arr, int target) {
        int start = 0;
        int end = arr.length -1;
        boolean isAscending = arr[start] < arr[end];

        while (start <= end) {
            int mid = start + (end - start) / 2;

            if (target == arr[mid]) {
                return mid;
            }

            if (isAscending) {
                if (target > arr[mid]) {
                    start = mid + 1;
                } else {
                    end = mid -1;
                }
            } else {
                if (target > arr[mid]) {
                    end = mid - 1;
                } else {
                    start = mid + 1;
                }
            }
        }

        return end;
    }
}

我正在尝试获取数字上限和数字下限的索引值。从数组中显然应该是

ceilingOfNumber 应返回:3 FloorOfNumber 应返回:4

但他们却回来了

ceilingOfNumber 应返回:4 FloorOfNumber 应返回:3

我尝试调试它,也进行了代码跟踪,但找不到任何解决方案。

java binary-search floor ceil
1个回答
0
投票

您实现的代码的问题是,您总是返回单元格值的开始索引和下限值的结束索引,即使您同时考虑升序和降序数组。

让我们了解一下这个问题。根据逻辑,如果目标数字不存在于实际数组中,则循环只会在

end < start
时终止。现在,如果它是升序数组,则结束索引的值将小于开始索引的值。因此,下限的结束索引和上限的开始索引没有问题。但是 对于降序数组,
end < start
意味着起始索引的值小于结束索引的值。在这种情况下,上限应该是结束索引,下限应该是开始索引

你可以改变你的逻辑 -
天花板:

return isAscending ? start : end;

楼层:
return isAscending ? end : start;

© www.soinside.com 2019 - 2024. All rights reserved.