每日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;
    }
}

相关推荐
一匹电信狗6 小时前
【LeetCode_547_990】并查集的应用——省份数量 + 等式方程的可满足性
c++·算法·leetcode·职场和发展·stl
鱼跃鹰飞7 小时前
Leetcode会员尊享100题:270.最接近的二叉树值
数据结构·算法·leetcode
梵刹古音8 小时前
【C语言】 函数基础与定义
c语言·开发语言·算法
筵陌8 小时前
算法:模拟
算法
We་ct8 小时前
LeetCode 205. 同构字符串:解题思路+代码优化全解析
前端·算法·leetcode·typescript
renhongxia19 小时前
AI算法实战:逻辑回归在风控场景中的应用
人工智能·深度学习·算法·机器学习·信息可视化·语言模型·逻辑回归
CoderCodingNo9 小时前
【GESP】C++四级/五级练习题 luogu-P1223 排队接水
开发语言·c++·算法
民乐团扒谱机9 小时前
【AI笔记】精密光时频传递技术核心内容总结
人工智能·算法·光学频率梳
CoderCodingNo9 小时前
【GESP】C++五级/四级练习题 luogu-P1413 坚果保龄球
开发语言·c++·算法
2301_8223663510 小时前
C++中的命令模式变体
开发语言·c++·算法