逼迫 ChatGPT 4 承认我的算法就是比你优化后的好的心路历程(大 AI 时代要来了)

首先我解了一道 leetcode 算法题
34. 在排序数组中查找元素的第一个和最后一个位置
我写完的解是这样的:

public class Question34 {
    
    

    public static int[] searchRange(int[] nums, int target) {
    
    
        if (nums == null || nums.length < 1) {
    
    
            return new int[]{
    
    -1, -1};
        }
        // 找目标值起始和终止位置,要求 logN  , 非递减顺序排列, 二分查找
        int start = -1;
        int end = -1;
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
    
    
            int mid = left + ((right - left) >> 1);
            if (nums[mid] < target) {
    
    
                left = mid + 1;
            } else if (nums[mid] > target) {
    
    
                right = mid - 1;
            } else {
    
    
                // 等于的情况 我嗅探一下看看能不能返回
                start = end = mid;
                // 就这个一个
                if (start > 0 && nums[start - 1] != target && start < nums.length - 1 && nums[start + 1] != target) {
    
    
                    return new int[]{
    
    start, end};
                }
                break;
            }
        }
        if (start > 0) {
    
    
            // 找到右侧第一个不等于 target 的位置
            left = 0;
            right = start - 1;
            while (left <= right) {
    
    
                int mid = left + ((right - left) >> 1);
                if (nums[mid] == target) {
    
    
                    start = mid;
                    right = mid - 1;
                } else if (nums[mid] < target) {
    
    
                    left = mid + 1;
                }
            }
        }
        if (end < nums.length - 1 && end >= 0) {
    
    
            left = end + 1;
            right = nums.length - 1;
            while (left <= right) {
    
    
                int mid = left + ((right - left) >> 1);
                if (nums[mid] == target) {
    
    
                    end = mid;
                    left = mid + 1;
                } else if (nums[mid] > target) {
    
    
                    right = mid - 1;
                }
            }
        }

        return new int[]{
    
    start, end};
    }

    public static void main(String[] args) {
    
    
        /*System.out.println(Arrays.toString(searchRange(new int[]{5, 7, 7, 8, 8, 10}, 8)));
        System.out.println(Arrays.toString(searchRange(new int[]{5, 7, 7, 8, 8, 10}, 6)));*/
        System.out.println(Arrays.toString(searchRange(new int[]{
    
    2, 2}, 2)));
        System.out.println(Arrays.toString(searchRange(new int[]{
    
    2}, 2)));
    }
}

懒得优化结构,尝试问问 ChatGPT 4
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

public static int[] searchRange(int[] nums, int target) {
    
    
    if (nums == null || nums.length < 1) {
    
    
        return new int[]{
    
    -1, -1};
    }
    
    int start = findStart(nums, target);
    int end = findEnd(nums, target);
    return new int[]{
    
    start, end};
}

private static int findStart(int[] nums, int target) {
    
    
    int left = 0;
    int right = nums.length - 1;
    int start = -1;

    while (left <= right) {
    
    
        int mid = left + ((right - left) >> 1);
        if (nums[mid] < target) {
    
    
            left = mid + 1;
        } else if (nums[mid] > target) {
    
    
            right = mid - 1;
        } else {
    
    
            start = mid;
            right = mid - 1;
        }
    }
    return start;
}

private static int findEnd(int[] nums, int target) {
    
    
    int left = 0;
    int right = nums.length - 1;
    int end = -1;

    while (left <= right) {
    
    
        int mid = left + ((right - left) >> 1);
        if (nums[mid] < target) {
    
    
            left = mid + 1;
        } else if (nums[mid] > target) {
    
    
            right = mid - 1;
        } else {
    
    
            end = mid;
            left = mid + 1;
        }
    }
    return end;
}


在这里插入图片描述

不错不错!直接分两个方法算开始位置和结束位置更简洁,我一开始的思路不在这个方向
但是吧,事情不应该这么容易 ChatGPT 4 ,我可不能让你这么简单过关
我追问

在这里插入图片描述

nnd 精细化看不懂是吧,诶嘿

在这里插入图片描述

道歉挺快
好嘛,最后还给我但是一句,看我怎么堵你

在这里插入图片描述

public static int[] searchRange(int[] nums, int target) {
    
    
    if (nums == null || nums.length < 1) {
    
    
        return new int[]{
    
    -1, -1};
    }

    int start = -1;
    int end = -1;
    int left = 0;
    int right = nums.length - 1;

    // First binary search to find the target
    while (left <= right) {
    
    
        int mid = left + ((right - left) >> 1);
        if (nums[mid] < target) {
    
    
            left = mid + 1;
        } else if (nums[mid] > target) {
    
    
            right = mid - 1;
        } else {
    
    
            start = end = mid;
            break;
        }
    }

    if (start == -1) {
    
    
        return new int[]{
    
    start, end};
    }

    // Adjust start and end positions
    left = 0;
    right = start - 1;
    while (left <= right) {
    
    
        int mid = left + ((right - left) >> 1);
        if (nums[mid] == target) {
    
    
            start = mid;
            right = mid - 1;
        } else {
    
    
            left = mid + 1;
        }
    }

    left = end + 1;
    right = nums.length - 1;
    while (left <= right) {
    
    
        int mid = left + ((right - left) >> 1);
        if (nums[mid] == target) {
    
    
            end = mid;
            left = mid + 1;
        } else {
    
    
            right = mid - 1;
        }
    }

    return new int[]{
    
    start, end};
}

在这里插入图片描述
知错认错改错,大 AI 时代要来了……
鬼知道我们这一代要经历多少变革

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/w903328615/article/details/129826493