每日5题Day17 - LeetCode 81 - 85

每一步向前都是向自己的梦想更近一步,坚持不懈,勇往直前!

第一题:81. 搜索旋转排序数组 II - 力扣(LeetCode)

java 复制代码
class Solution {
    public boolean search(int[] nums, int target) {
        int n = nums.length;
        if (n == 0) {
            return false;
        }
        if (n == 1) {
            return nums[0] == target;
        }
        //由于是降序的,所以我们采用二分查找的思路
        int l = 0, r = n - 1;
        while (l <= r) {
            int mid = (l + r) / 2;
            if (nums[mid] == target) {
                return true;
            }
            //注意把重复的去掉
            if (nums[l] == nums[mid] && nums[mid] == nums[r]) {
                ++l;
                --r;
            } else if (nums[l] <= nums[mid]) {
                if (nums[l] <= target && target < nums[mid]) {
                    r = mid - 1;
                } else {
                    l = mid + 1;
                }
            } else {
                if (nums[mid] < target && target <= nums[n - 1]) {
                    l = mid + 1;
                } else {
                    r = mid - 1;
                }
            }
        }
        return false;
    }
}

第二题:82. 删除排序链表中的重复元素 II - 力扣(LeetCode)

java 复制代码
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode dummy = new ListNode(-1, head);
        //注意使用三个标记位
        ListNode pre = dummy, cur = head, nex = head.next;
        while (cur != null && nex != null) {
            //如果不同,则向后移位一位
            if (cur.val != nex.val) {
                pre = pre.next;
                cur = cur.next;
                nex = nex.next;
            } else {
                //否则找到下一个不一样的
                while (nex != null && nex.val == cur.val) {
                    nex = nex.next;
                }
                //把不同的连接起来
                pre.next = nex;
                //向后移动
                cur = nex;
                if (nex != null) {
                    nex = nex.next;
                }
            }
        }
        return dummy.next;
    }
}

第三题:83. 删除排序链表中的重复元素 - 力扣(LeetCode)

java 复制代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        //很简单,就留一次
        if(head == null){
            return head;
        }
        ListNode dummyhead = new ListNode(-1, head);
        ListNode cur = head;
        while(cur.next != null){
            if(cur.val == cur.next.val){
                cur.next = cur.next.next;
            }
            else{
                cur = cur.next;
            }
        }
        return dummyhead.next;
    }
}

第四题:84. 柱状图中最大的矩形 - 力扣(LeetCode)

java 复制代码
class Solution {
    public int largestRectangleArea(int[] heights) {
        int MAX = 0;
        //我们使用单调站,找出两边最低的位置
        int [] left = new int[heights.length], right = new int[heights.length];
        for (int i = 0; i < left.length; ++i) left[i] = -1; 
        for (int i = 0; i < right.length; ++i) right[i] = heights.length;     
        LinkedList<Integer> list = new LinkedList<>();
        for (int i = 0; i < heights.length; ++i) {
            while (!list.isEmpty() && heights[i] < heights[list.peekLast()]) {
                right[list.pollLast()] = i;
            }
            list.offerLast(i);
        }
        list.clear();
        for (int i = heights.length - 1; i >= 0; --i) {
            while (!list.isEmpty() && heights[i] < heights[list.peekLast()]) {
                left[list.pollLast()] = i;
            }
            list.offerLast(i);
        }
        for (int i = 0; i < heights.length; ++i) {
            //对于每一个,我们均计算最大值
            MAX = Math.max(MAX, (right[i] - left[i] - 1) * heights[i]);
        }
        return MAX;
    }
}

第五题:85. 最大矩形 - 力扣(LeetCode)

java 复制代码
class Solution {
    public int maximalRectangle(char[][] matrix) {
        int m = matrix.length;
        if (m == 0) {
            return 0;
        }
        int n = matrix[0].length;
        int[][] left = new int[m][n];
        //我们找到以当前位置为右边界,当前行最长的1的连续长度
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == '1') {
                    left[i][j] = (j == 0 ? 0 : left[i][j - 1]) + 1;
                }
            }
        }

        int ret = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == '0') {
                    continue;
                }
                int width = left[i][j];
                int area = width;
                for (int k = i - 1; k >= 0; k--) {
                    width = Math.min(width, left[k][j]);
                    area = Math.max(area, (i - k + 1) * width);
                }
                ret = Math.max(ret, area);
            }
        }
        return ret;
    }
}

相关推荐
千寻girling3 小时前
Python 是用来做 AI 人工智能 的 , 不适合开发 Web 网站 | 《Web框架》
人工智能·后端·算法
颜酱6 小时前
一步步实现字符串计算器:从「转整数」到「带括号与优化」
javascript·后端·算法
CoovallyAIHub1 天前
语音AI Agent编排框架!Pipecat斩获10K+ Star,60+集成开箱即用,亚秒级对话延迟接近真人反应速度!
深度学习·算法·计算机视觉
木心月转码ing1 天前
Hot100-Day14-T33搜索旋转排序数组
算法
会员源码网1 天前
内存泄漏(如未关闭流、缓存无限增长)
算法
颜酱1 天前
从0到1实现LFU缓存:思路拆解+代码落地
javascript·后端·算法
颜酱1 天前
从0到1实现LRU缓存:思路拆解+代码落地
javascript·后端·算法
CoovallyAIHub2 天前
Moonshine:比 Whisper 快 100 倍的端侧语音识别神器,Star 6.6K!
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
速度暴涨10倍、成本暴降6倍!Mercury 2用扩散取代自回归,重新定义LLM推理速度
深度学习·算法·计算机视觉