java学习 leetcode 二分查找 图论

74 搜索二维矩阵

复制代码
class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
            return false;
        }

        int m = matrix.length;
        int n = matrix[0].length;

        int left = 0;
        int right = m*n -1;

        while(left <= right){
            int mid = left + (right -left)/2;
            int midvalue = matrix[mid/n][mid%n];

            if(midvalue == target){
                return true;
            }else if(midvalue < target){
                left =mid +1;

            }else{
                right = mid -1;
            }


        }

        return false;
    }
}

34 排序数组查找第一个最后一个位置

旋转排序数组、以及最小值,这类思路差不多

4. 寻找正序数组的中位数

这个比较难写,后面再看看,思路是:一个是划分数组,一个二分查找

复制代码
// class Solution {
//     public double findMedianSortedArrays(int[] nums1, int[] nums2) {
//         //思路就是找到索引为 ,,这里的代码可能后面完善下
//         //(m + n) / 2  -> (m+n)/2+1的平均值
//         //奇数的话找到 (m + n)/2
//         int right_m = m = nums1.length;
//         int right_n = n = nums2.length;
//         int left_m = left_n = 0;
//         int m_mid = m/2;
//         int n_mid = n/2;
        
//         if(nums1[m_mid]>nums2[n_mid]){
//             left_n = n_mid;
//             while(nums2[left_n] < nums1[right_n]){

//             }
//         }
//     }
// }


    class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        // 确保 nums1 是较短的数组,减少二分搜索范围
        if (nums1.length > nums2.length) {
            return findMedianSortedArrays(nums2, nums1);
        }

        int m = nums1.length;
        int n = nums2.length;
        int left = 0, right = m;  // 在 nums1 上进行二分

        while (left <= right) {
            int partition1 = left + (right - left) / 2;           // nums1 的分割线右边第一个元素的索引
            int partition2 = (m + n + 1) / 2 - partition1;        // nums2 的分割线

            // 左半部分的最大值
            int maxLeft1 = (partition1 == 0) ? Integer.MIN_VALUE : nums1[partition1 - 1];
            int maxLeft2 = (partition2 == 0) ? Integer.MIN_VALUE : nums2[partition2 - 1];

            // 右半部分的最小值
            int minRight1 = (partition1 == m) ? Integer.MAX_VALUE : nums1[partition1];
            int minRight2 = (partition2 == n) ? Integer.MAX_VALUE : nums2[partition2];

            // 满足中位数分割条件:左 <= 右
            if (maxLeft1 <= minRight2 && maxLeft2 <= minRight1) {
                // 分奇偶计算中位数
                if ((m + n) % 2 == 0) {
                    // 偶数个元素:取 (左最大 + 右最小) / 2.0
                    return (Math.max(maxLeft1, maxLeft2) + Math.min(minRight1, minRight2)) / 2.0;
                } else {
                    // 奇数个元素:左半部分最大值就是中位数
                    return Math.max(maxLeft1, maxLeft2);
                }
            } else if (maxLeft1 > minRight2) {
                // nums1 分割线太靠右,需要左移
                right = partition1 - 1;
            } else {
                // maxLeft2 > minRight1,需要将 nums1 分割线右移
                left = partition1 + 1;
            }
        }

        // 理论上不会执行到这里
        throw new IllegalArgumentException("输入数组不是有序的");
    }
}

994腐烂的橘子

多源bfs

207课程表

拓扑排序,用到入度啥的,比较好理解

208前缀树

这个比较难些,后面再仔细看下

这样100就先刷完一遍了,感觉语法和算法以及变量声明等等,还是有很多不熟悉的地方,算法大致的流程都知道了,也算是有所收获,后面好好看下项目,做项目体会应用,结合着刷算法题,加油

相关推荐
YM52e3 分钟前
鸿蒙ArkTS项目实战 - 门店陈列巡检台:完整代码与运行效果
学习·华为·harmonyos
weixin_538601978 分钟前
智能体测开Day56
java
杨丰玮41823 分钟前
从零手写Java飞机躲障碍游戏|Swing绘图、鼠标跟随、计时器碰撞检测实战(五)
java·python·游戏·游戏引擎·图形渲染·动画·贴图
莫得感情 o1 小时前
踩坑 - 压测三轮后 502:一个默认 10 的连接池如何拖垮整个服务
java
Escalating_xu1 小时前
【Linux线程】线程控制全解析:终止、join/detach、cancel、线程栈与 NPTL(下篇)
java·linux·运维
2602_959960921 小时前
电商大厂Java面试实录:Spring Boot/JVM/Redis/Kafka/微服务/安全/测试全解析
java·jvm·spring boot·redis·面试题
老当益壮梁奶奶1 小时前
Linux软件编程学习笔记(二)Linux文件IO编程入门:从fopen到fgetc
linux·c语言·c++·笔记·学习
sunoo-2291 小时前
C 语言文件 IO 全攻略:从基础函数到实战踩坑(BMP 读取 + 词典查询)
linux·c语言·前端·笔记·vscode·学习
吃饱了得干活1 小时前
限界上下文之后:微服务怎么拆、上下文怎么聊?
java·后端·架构
蒸蒸yyyyzwd2 小时前
cpp选手秋招学习笔记 day12
笔记·学习·oracle