hot100补充(5道题目一组)

leetcode hot100 中等难度 day03-刷题 阅读详情

 

//这么简单得题目,别强迫症了啊,无所谓啊,哎

//3.21记住只要是题目都很奇妙,不奇妙得没法出,大胆写
//就是两种变化从1234到1243这是第一类,直接倒数两个得交换
//第二种变换1243到1324这种,当前值和后面比当前大得排序后最小得交换。
//因为这个题目是只找当前传入的下一个就行
class Solution {
    public void nextPermutation(int[] nums) {
        int len = nums.length;
        for (int i = len - 1; i > 0; i--) {
            if (nums[i - 1] < nums[i]) {
                //i, len都是指下标,不包括len的升序排列(java中很多方法都是这样)
                Arrays.sort(nums, i, len);
                //然后从后面开始寻找最小的那个比我大的值
                for (int j = i; j < len; j++) {
                    if (nums[j] > nums[i - 1]) {
                        //注意i-1这种类型经常的写错。
                        int temp = nums[j];
                        nums[j] = nums[i - 1];
                        nums[i - 1] = temp;
                        return;
                    }
                }
            }
        }
        //到了最大的时候,返回最小的排序
        Arrays.sort(nums);
        return;
    }
}

//有序肯定是二分查找
class Solution {
    public int search(int[] nums, int target) {
        int len = nums.length;
        int left = 0;
        int right = len - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (nums[mid] == target) return mid;
            //反正一边是有序一边是无序,判断哪边有序,哪边无序
            //左边有序(这个题目的重点是这个=要加在这个位置,因为到只要2个元素,而元素命中第二个的时候,必须使用left=mid+1,而不是right=mid-1)(比如输入[3, 1],target=1的时候)
            //用nums[0]和nums[mid]对比来判断哪边有序
            if (nums[0] <= nums[mid]) {
                //如果target在左边
                if (nums[0] <= target && target < nums[mid]) {
                    right = mid - 1;
                } else {
                    left = mid + 1;
                }
                //如果右边有序
            } else {
                //若target在右边
                if (nums[mid] < target && target <= nums[len - 1]) {
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            }
        }
        return -1;
    }
}

 

 

//动态规划5个步骤
class Solution {
    public int minPathSum(int[][] grid) {
        //确定dp数组下标的含义dp[][]代表到达这个位置时候的最小路径和
        //递推表达式:dp[i][j] = Math.min(dp[i][j+1] + dp[i+1][j]) + grid[i][j];
        //初始化
        int rows = grid.length;
        int columns = grid[0].length;
        int[][] dp = new int[rows][columns];
        dp[0][0] = grid[0][0];
        for (int i = 1; i < rows; i++) dp[i][0] = dp[i - 1][0] + grid[i][0];
        for (int i = 1; i < columns; i++) dp[0][i] = dp[0][i - 1] +grid[0][i];
        for (int i = 1; i < rows; i++) {
            for (int j = 1; j < columns; j++) {
                dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
            }
        }
        return dp[rows - 1][columns - 1];
    }
}

//很明显双指针,原地修改
class Solution {
    public void sortColors(int[] nums) {
        int p0 = 0;
        int p1 = 0;
        int i = 0;
        //只碰见1或者0的时候,直接交换,在没2的情况下,01肯定直接交换
        //在有2的情况下,先碰见1又碰见的0的时候多了一次交换。
        //脑袋中应该想到既然多了个指针,肯定有说法啊,这个题目就是001120这个时候怎么处理麻烦,
        //很明显啊,先把第一个最后一个0和第一个1(也就是此时的i和p0),2在和此时1交换(也就是i和p1),
        //所以在0的时候有说法
        while (i < nums.length) {
            //i=1的时候让p0留下,p1走,这样才能做到上面那样的交换
            //p1一直代表交换位置的大小,肯定一直++
            if (nums[i] == 1) {
                swap(nums, i, p1);
                i++;
                p1++;
            } else if (nums[i] == 0) {
                swap(nums, i, p0);
                if (p0 < p1) {
                    swap(nums, i, p1);
                }
                i++;
                p0++;
                p1++;
            } else {
                i++;
            }
        }
    }

    public static void swap(int[] nums, int a, int b) {
        int temp = nums[a];
        nums[a] = nums[b];
        nums[b] = temp;
    }
}

 

 

// class Solution {
//     /**
//      * 方向,分别是 上,下,左,右
//      */
//     int[][] direction = {{-1,0},{1,0},{0,-1},{0,1}};
//     public boolean exist(char[][] board, String word) {
//         //字符串长度大于 矩阵个数,直接返回
//         if (word.length() > board.length * board[0].length) return false;
//         //使用记录
//         boolean[][] used = new boolean[board.length][board[0].length];
//         for (int i = 0; i < board.length; i++) {
//             for (int j = 0; j < board[0].length; j++) {
//                 used[i][j] = true;
//                 //如果返回的是true,则直接返回,反之则继续
//                 if (dfs(board,used,i,j,word,0)) return true;
//                 used[i][j] = false;
//             }
//         }
//         return false;
//     }

//     public boolean dfs(char[][] board,boolean[][] used,int h,int l,String word,int index) {
//         //字符不相等 返回false
//         if (board[h][l] != word.charAt(index)) {
//             return false;
//         }
//         /**
//          * 当下标 与 字符串长度 - 1 相等时,返回true.按照逻辑 
//          * 应该是前面的那个if条件满足后 else 中去判断的,为了
//          * 看起来舒服一点(因为自己写的拉跨)
//          */
        
//         if (index == word.length() - 1) {
//             return true;
//         }
//         for (int[] a:direction) {
//             int row = h + a[0],col = l + a[1];
//             // 在矩阵范围内且没有被使用过
//             if (row >= 0 && row < board.length && col >= 0 && col < board[0].length && !used[row][col]) {
//                 used[row][col] = true;
//                 int tmp = index;
//                 //如果返回true,则直接返回。反之则继续
//                 if (dfs(board,used,row,col,word,++tmp)) return true;
//                 used[row][col] = false;
//             }
//         }
//         return false;
//     }
// }
class Solution {
    //搜索方向,分别是 上,下,左,右,顺序并不重要
    int[][] souSuo = new int[][]{{0, -1}, {0, 1}, {1, 0}, {-1, 0}};
    //used[][]表示是否被使用过
    boolean[][] used;
    public boolean exist(char[][] board, String word) {
        used = new boolean[board.length][board[0].length];
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[i].length; j++) {
                used[i][j] = true;
                //开始搜索
                if(dfs(board, word, i, j, 0)) return true;
                used[i][j] = false;
            }
        }
        return false;
    }

    public boolean dfs(char[][] board, String word, int i, int j, int index) {
        if (board[i][j] != word.charAt(index)) {
            return false;
        }
        if (index == word.length() - 1) {
            return true;
        }
        for (int[] x : souSuo) {
            int row = i + x[0];
            int column = j + x[1];
            if (row >= 0 && row < board.length && column >= 0 && column < board[i].length && !used[row][column]) {
                used[row][column] = true;
                //要拿出来,找4次不一定哪次找到
                int temp = index;
                //先++在传入
                if (dfs(board, word, row, column, ++temp)) return true;
                used[row][column] = false;
            }
        }
        return false;
    }
}

leetcode hot100 中等难度 day04-刷题 阅读详情

相关推荐

LVGL 离线字体转换lv_font_conv本地安装

LVGL FONT CONV 离线版本

liu132641的专栏 3387

Leetcode HOT 100 题目总结(已完结)

文章目录前引题目博客链接Easy No.1 - No.21 前引 这段时间感觉动态规划已经做伤了 就是真的没什么动力再做下去了 后面没做的也都是难的不行的dp题目了 想着还是要做的 这段时间换点口味 把力扣HOT 100题给全做了 写个总结 题目博客链接 Easy No.1 - No.21 461. 汉明距离 617. 合并二叉树 104. 二叉树的最大深度 206. 反转链表 169. 多数元素 21. 合并两个有序链表 ...

Love 6's Private Blog 1万+

告别两个电源模块!用UCD3138+四开关Buck-Boost,一个电路搞定电池充放电(附原理图分析)

本文详细介绍了采用UCD3138数字控制器和四开关Buck-Boost拓扑的双向DC/DC变换器设计,实现单一电路完成电池智能充放电管理。该方案显著降低BOM成本和PCB面积,提升系统效率至96.2%,适用于UPS、通信基站和储能系统,具有高效、紧凑和成本优势。

weixin_30256901的博客 397

LeetCode 热题 HOT 100 题解(仅记录解题思路)

由于数组中只有一个元素出现一次,其余元素都出现两次,因此用集合中的元素之和的两倍减去数组中的元素之和,剩下的数就是数组中只出现一次的数字。遍历数组中的每个数字,如果集合中没有该数字,则将该数字加入集合,如果集合中已经有该数字,则将该数字从集合中删除,最后剩下的数字就是只出现一次的数字。指针p1在头结点处,指针p2在头结点的next处,然后p1每次移动1格,p2则走2步,若在其中一个进入null之前两者指向同一结点,则代表有环。使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。

a131529的博客 1万+

FoundationPose复现及Realsense应用

FoundationPose是一个统一的基础模型,用于6D对象姿态估计和跟踪,支持基于模型和无模型的设置。在测试时可以立即应用于未见过的新对象,无需微调,只要给出其CAD模型,或者捕获少量RGBD参考图像。得益于统一框架,下游姿态估计模块在两种3D模型设置中都是相同的,当没有CAD模型时,使用神经隐式表示进行高效的新视角合成。通过大规模合成训练,辅以大型语言模型(LLM)、一种基于transformer的新架构和对比学习公式,实现了强大的泛化能力。

m0_56661101的博客 1万+

用FPGA在HDMI上显示自定义字符:从COE文件到OSD叠加的保姆级教程

本文详细介绍了如何在FPGA上实现HDMI视频流的OSD字符叠加技术,从COE文件生成到动态区域控制的完整流程。通过Verilog代码示例和实战技巧,帮助开发者掌握字符ROM设计、像素坐标追踪和动态混合等核心技术,适用于视频监控、系统状态显示等应用场景。

weixin_28720767的博客 231

leetcode HOT100总结

本人菜鸡一枚,历时两个月时间把HOT100题做完(Ctrl C-V)了,做完之后还是感觉到很虚,很多中等题还是不会做,于是乎花几天时间把这100题给总结一下。一方面,对自己的知识梳理;另一方面,便于后续回顾。(完成度99,是因为有一道题目收费,没有做!哈哈哈!)以下所有题目都是用Python3实现的。 下面是对这些题目按照算法进行分类整体,主要包括排序、哈希表、递归\回溯、链表、双指针、动态规划、二分查找、贪心、树、深度优先搜索、广度优先搜索等。 在整理之前,先学习一下Python的基本数据类型有哪些,请

qq_36561737的博客 4750

第1章:Zephyr 开发环境搭建与 Hello World

📝【摘要】本文是Zephyr RTOS开发入门指南的第一章,详细介绍了从环境搭建到首个应用运行的完整流程。主要内容包括:1️⃣ Zephyr项目结构解析与west工具链部署;2️⃣ 开发环境配置(Linux/WSL)及SDK安装;3️⃣ 两种实践路径——官方HelloWorld样例与自定义应用开发;4️⃣ 实际硬件部署方法(nRF/STM32)及常用west命令速查;5️⃣ 典型问题解决方案。通过qemu_x86模拟器演示了基础打印功能实现,为后续深度开发奠定基础。

hemoparrot的专栏 1361

力扣hot100

【代码】力扣hot100。

qq_59768361的博客 1401

OpenClaw(Clawdbot/Moltbot)如何正确的配置浏览器,实现对浏览器的自动化操作功能(浏览器状态为running:false怎么办)

OpenClaw(Clawdbot/Moltbot)浏览器自动化功能无效?🤖 本文详细介绍如何解决这个问题🔧,让你的OpenClaw(Clawdbot/Moltbot)真正具备"睁眼看世界"的能力,支持网页搜索、点击操作和截图等功能 ✅

XiaoqiangClub的博客 8109

强化学习优化多目标冲突推理的决策过程设计

1. 背景介绍 强化学习(Reinforcement Learning,RL)作为机器学习的一个重要分支,近年来在计算机科学和人工智能领域取得了显著的进展。其核心思想是通过试错来学习最优策略,从而在复杂的环境中实现目标。然而,在多目标冲突推理(Multi-Objective Conflict Reasoning,MOCR)问题上,强化学习面临着诸多挑

AI天才研究院 1513

力扣hot100分类整理及解题方法

对应力扣题号

lmh_qwq的博客 2642

数据服务:数据服务框架Magic-API 介绍及实践

接口快速开发框架 基于Java的接口快速开发框架,编写接口将通过magic-api提供的UI界面完成,自动映射为HTTP接口,无需定义Controller、Service、Dao、Mapper、XML、VO等Java对象即可完成常见的HTTP API接口开发 。在线页面快速开发平台 基于 vue 的在线页面快速开发平台,主要把所有的 vue 代码都改为在线配置,最终获得一个 json 格式的页面新一代爬虫平台 基于Java实现的新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。今天给大家安利一

GIS摆渡人 2063

LeetCode Hot100题解

链表的多数问题可以通过双指针(快慢指针、前后指针)高效解决。

2301_82023822的博客 2672

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LeetCode HOT100

力扣HOT100刷题记录1.两数之和2. 两数相加3.无重复字符的最长子串6. Z字形变换7.整数反转 1.两数之和 这道题比较简单,直接利用哈希map建立一个字典,然后遍历循环,当前面存的key存在等于target-nums[i],则返回找到的数字的索引。若不存在,则将键值对放入hashmap中。最后遍历结束如果还没找到,就返回一个int数组[0],空数组。 class Solution { public int[] twoSum(int[] nums, int target) {

jiandandian_的博客 1719

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

力扣hot100 1-5

力扣hot100 1-5 两数之和

2503_90353997的博客 821

力扣hot100——动态规划

hot100中的动态规划

qq_65507629的博客 1186

力扣hot100——二分查找

hot100刷题之二分法

qq_65507629的博客 1336

leetcode-hot-100 (链表)

链表专题

weixin_73557167的博客 878

LeetCode-Hot100 31.K个一组反转链表

}*/核心逻辑统计长度→分组反转→拼接边界,其中「拼接边界」是核心难点;关键指针p0:组前驱,负责拼接反转后的组;pre/cur:组内反转的双指针;dummy:统一头节点处理逻辑;执行顺序:先反转组内节点,再拼接组的首尾,最后更新p0处理下一组。

2302_80987544的博客 1155

力扣hot100_动态规划

原问题是 “从全部房子中能偷到的最大金额”,将问题的规模缩小,子问题就是 “从 k 个房子中能偷到的最大金额 ”,用 f(k) 表示。可以看到,子问题是参数化的,我们定义的子问题中有参数 k。假设一共有 n 个房子的话,就一共有 n 个子问题。动态规划实际上就是通过求这一堆子问题的解,来求出原问题的解。这要求子问题需要具备两个性质:原问题要能由子问题表示。例如这道小偷问题中,k=n 时实际上就是原问题。否则,解了半天子问题还是解不出原问题,那子问题岂不是白解了。

weixin_47113960的博客 1318

leetcode hot-100 刷题笔记

在gap year期间努力去做到不摆烂,因此就开启了leetcode hot-100刷题之旅。希望自己能够坚持学习......

weixin_64811269的博客 1521

力扣hot100——贪心

贪心

qq_65507629的博客 1191

part1-HOT100+剑指Offer

leetcode:https://leetcode-cn.com/problemset/algorithms/ 类别:热题HOT100 easy篇 共26道 No.1 标签:栈 设计 155. Min Stack class MinStack { public: /** initialize your data structure here. */ stack<int&...

升级迭代 812

Leetcode之 Hot 100

1 按专题刷:不要随机刷。选择一个专题(如“动态规划”),集中刷 5-10 道题,总结规律和模板。2 先思考,后看解:给自己 15-30 分钟独立思考,想不出来没关系,但一定要有自己的思路。然后看题解,理解最优解法的精髓。3 画图分析:对于链表、二叉树、递归、动态规划等问题,动手画图能极大地帮助理解。4 反复练习:过一段时间(如一周后)重新做一遍之前做过的题,确保真正掌握,而不是“背答案”。5 总结模板:很多题有通用解法。例如:回溯模板:选择 -> 递归 -> 撤销选择。

媛媛 2098

HOT 100(导航)【LeetCode】

HOT 100(导航)【LeetCode】

小心星的博客 860
上一篇: 初步了解贪心算法
下一篇: hot100补充(5题一组)
一个小孩丶
博客等级 码龄6年 2粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值