IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 力扣day08 -> 正文阅读

[数据结构与算法]力扣day08

31.下一个排列

思路很简单,题解也是一样的思路,先从后往前找到nums[j]>nums[j-1],再在j到nums.length-1之中找到最小的那个nums[k]>nums[j-1],交换顺序,j到nums.length再重新排序

    public void nextPermutation(int[] nums) {
        int n = nums.length;
        int k = n - 1;
        while (k - 1 >= 0 && nums[k - 1] >= nums[k]) k--;
        if (k == 0) {
            reverse(nums, 0, n - 1);
        } else {
            int u = k;
            while (u + 1 < n && nums[u + 1] > nums[k - 1]) u++;
            swap(nums, k - 1, u);
            reverse(nums, k, n - 1);
        }
    }
    void reverse(int[] nums, int a, int b) {
        int l = a, r = b;
        while (l < r) {
            swap(nums, l++, r--);
        }
    }
    void swap(int[] nums, int a, int b) {
        int c = nums[a];
        nums[a] = nums[b];
        nums[b] = c;
    }

在这里插入图片描述

32. 最长有效括号

这个括号()()是对的,(())也算对的,刚开始没读懂

  public static int longestValidParentheses(String s) {
        int max = 0;
        Deque<Integer> stack = new ArrayDeque<>();
        stack.push(-1);//方便计算最大值
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '(') {
                stack.push(i);
            } else {
                stack.pop();
                if (stack.isEmpty()) {
                    stack.push(i);
                } else {
                    max = Math.max(max, i - stack.peek());
                }
            }
        }
        return max;
    }

在这里插入图片描述

33. 搜索旋转排序数组

暴力法,复杂度O(n)

    public int search(int[] nums, int target) {
        int index = -1;
        for(int i=0; i<nums.length; i++){
            if(nums[i]==target){
                return i;
            }
        }
        return index;
    }

在这里插入图片描述

进阶,二分法

public static int search(int[] nums, int target) {
        int len = nums.length;
        int left = 0, right = len-1;
        while(left <= right){
            int mid = (left + right) / 2;
            if(nums[mid] == target) {
                return mid;
            } else if(nums[mid] < nums[right]){
                if(nums[mid] < target && target <= nums[right]) {
                    left = mid+1;
                } else {
                    right = mid-1;
                }
            }
            else{
                if(nums[left] <= target && target < nums[mid]) {
                    right = mid-1;
                } else {
                    left = mid+1;
                }
            }
        }
        return -1;
    }

在这里插入图片描述

34. 在排序数组中查找元素的第一个和最后一个位置

双指针问题。。哦不,要求复杂度为O(logn),所以是二分查找问题
双指针:

public int[] searchRange(int[] nums, int target) {
        if(nums.length==0) {
            return new int[]{-1,-1};
        }
        //设置双指针
        int left=0,right=nums.length-1;
        int f1=0,f2=0;
        int[] res={-1,-1};
        while (left<=right){
            if(nums[left]==target&&f1==0){
                f1=1;
                res[0]=left;
            }else if(f1==0){
                left++;
            }
            if(nums[right]==target&&f2==0){
                f2=1;
                res[1]=right;
            }else if(f2==0){
                right--;
            }
            if(f1==1&&f2==1){
                break;
            }
        }
        return res;
    }

在这里插入图片描述
二分查找:

   public int[] searchRange(int[] nums, int target) {
        int find = searchRangeHelper(nums,target);
        if (find==-1){
            return new int[]{-1,-1};
        }
        int left =find-1;
        int right =find+1;
        while(left>=0 && nums[left]==target){
            left--;
        }
        while(right<nums.length && nums[right]==target){
            right++;
        }
        return new int[]{left+1,right-1};
    }
    private int searchRangeHelper(int[] nums,int target){
        int low =0;
        int high =nums.length-1;
        while(low<=high){
            int mid =low+(high-low)/2;
            int midValue =nums[mid];

            if(midValue>target){
                high =mid-1;
            }else if (midValue<target){
                low =mid+1;
            }else {
                return mid;
            }
        }
        return -1;
    }

在这里插入图片描述

36.有效的数独

题目还好理解,就是每一行每一列和每3x3个黑粗线分割的小方格里面数字都不能重复
这个大佬的代码很好理解,仿佛回到了中学时代

 public boolean isValidSudoku(char[][] board) {
        // 判断9行
        for(int i = 0; i < 9; i++){
            int[] judge = new int[9];
            for(int j = 0; j < 9; j++){
                int now = board[i][j] - '0';
                if(now >= 1 && now <= 9){
                    if(judge[now-1] != 0) return false;
                    judge[now-1] = 1;
                }
            }
        }
        // 判断9列
        for(int i = 0; i < 9; i++){
            int[] judge = new int[9];
            for(int j = 0; j < 9; j++){
                int now = board[j][i] - '0';
                if(now >= 1 && now <= 9){
                    if(judge[now-1] != 0) return false;
                    judge[now-1] = 1;
                }
            }
        }
        // 判断9块儿
        for(int sign = 0; sign < 9; sign++){
            int[] judge = new int[9];
            int f_i = (sign % 3) * 3;
            int f_j = (sign / 3) * 3;
            for(int i = f_i; i < f_i + 3; i++){
                for(int j = f_j; j < f_j + 3; j++){
                        int now = board[i][j] - '0';
                        if(now >= 1 && now <= 9){
                        if(judge[now-1] != 0) return false;
                        judge[now-1] = 1;
                    }
                }
            }
        }
        return true;
    }

我觉得这样刷下去做题没什么必要,后面还是挑一些能学会算法的刷一下,哎为了明年找个好实习,后面可以再补回来

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-09 17:39:16  更:2021-07-09 17:40:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/5 15:41:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码