10.1刷题计划一

news/2025/10/1 14:44:30/文章来源:https://www.cnblogs.com/huwy-123/p/19121789

力扣33题   搜索旋转排序数组

设x=nums[mid]是我们现在二分取到的数,需要判断x和target的位置关系。

(1)如果x和target在不同的递增段:

1.如果target在第一段,x在第二段,说明target在x在左边。

2.如果x在第一段,target在第二段,说明target在x在右边。

(2)如果x和target在相同的递增段:

和lowerbound函数一样,比较x和target的大小即可。

下面代码用的开区间二分,用其他二分写法也是可以的。

二分的范围可以是(-1,n-1),也就是闭区间[0,n-2]。

如果target=nums[n-1],那么下面代码每次循环更新的都是left,而right始终不变。循环结束后,答案自然就是n-1了。

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int last = nums.back();
        int left = -1,right  = nums.size()-1;   //开闭间(-1,n-1)
        while(left+1<right){             //开区间不为空
            int mid = left+(right-left)/2;
            int x = nums[mid];
            if(target>last && x<=last){       //target在第一段,x在第二段
                right = mid;                  //下轮循环去左边找
            }else if(x>last && target <= last){      //x在第一段,target在第二段
                left = mid;                   //下轮循环去右边找
            }else if(x>=target){              //否则,x和target在同一段
                right = mid;
            }else{
                left = mid;
            }
        }
        return nums[right] == target ? right : -1;
    }
};
 
 
力扣64题  最小路径和
动规五部曲
本题思路和力扣62题差不多
需要的是最小的路径和,所以状态转移方程就是dp[i][j]=min(dp[i-1][j]+grid[i][j],dp[i][j-1]+grid[i][j])
class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        vector<vector<int>>dp(grid.size(),vector<int>(grid[0].size()));
 
        dp[0][0] = grid[0][0];
        for(int i=1;i<grid.size();i++) dp[i][0] = dp[i-1][0]+grid[i][0];
        for(int i=1;i<grid[0].size();i++) dp[0][i] = dp[0][i-1]+grid[0][i];

        for(int i=1;i<grid.size();i++){
            for(int j=1;j<grid[0].size();j++){
                dp[i][j] = min(dp[i-1][j]+grid[i][j],dp[i][j-1]+grid[i][j]);
            }
        }
        return dp[grid.size()-1][grid[0].size()-1];
    }
};
 
力扣75题 颜色分类
需要进行两次遍历,使用两个指针分别用来交换0和1。
用指针p0来交换0,p1来交换1,初始值为0。
当我们从左向右遍历整个数组的时候。
如果找到了1,那么将其与nums[p1]进行交换,并将p1向后移动一个位置,与方法一相同。
如果找到了0,那么将其与nums[p0]进行交换,并将p0向后移动一个位置。连续的0之后是连续的1,因此如果将0
与nums[p0]进行交换的话,那么可能会把一个1交换出去。当p0<p1时,已经将一些1连续地放在头部,此时一定会把一个1交换出去,导致答案错误。
如果p0<p1,需要再将nums[i]与nums[p1]进行交换,其中i时当前遍历到的位置,在进行第一次交换后,nums[i]的值为1,需要将这个1放在头部的末端。
在最后,无论是否有p0<p1,需要将p0和p1均向后移动一个位置,而不是仅将p0向后移动一个位置。
 
屏幕截图 2025-09-30 201623

 

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int n = nums.size();
        int p0 = 0,p1 = 0;
        for(int i=0;i<n;i++){
            if(nums[i]==1){
                swap(nums[i],nums[p1]);
                ++p1;
            }else if(nums[i]==0){
                swap(nums[i],nums[p0]);
                if(p0<p1){
                    swap(nums[i],nums[p1]);
                }
                ++p0;
                ++p1;
            }
        }
    }
};
 
力扣78题 子集
组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!
子集问题是一种组合问题,因为集合是无序的,因此写回溯算法的时候,for就要从startindex开始,而不是从0开始。
1.递归函数参数
vector<vector<int>>result;
vector<int>path;
void backtracing(vector<int>&nums,int startindex){
2.递归终止条件
startindex已经大于数组的长度了,就终止了。
if(startindex>=nums.size()){
   return;
}
3.单层搜索逻辑
求取子集问题,不需要任何剪枝!因为子集就是要遍历整棵树。
for(int i=startindex;i<nums.size();i++){
    path.push_back(nums[i]);
    backtracing(nums,i+1);
    path.pop_back();
}
 
整体代码:
class Solution {
public:
    vector<vector<int>>result;
    vector<int>path;
    void backtracing(vector<int>&nums,int startindex){
        result.push_back(path);
        if(startindex>=nums.size()){
            return;
        }
        for(int i=startindex;i<nums.size();i++){
            path.push_back(nums[i]);
            backtracing(nums,i+1);
            path.pop_back();
        }
    }
    vector<vector<int>> subsets(vector<int>& nums) {
        result.clear();
        path.clear();
        backtracing(nums,0);
        return result;
    }
};
 
 
力扣148题 排序链表
思想就是以下两个题目
力扣876题 链表的中间结点
力扣21题  合并两个有序链表
归并排序(分治)
1.找到链表的中间结点head2的前一个节点,并断开head2与其前一个节点的连接。就把原链表均分成了两段更短的链表,。
2.分治,递归调用sortlist,分别排序head和head2。
3.排序后,得到了两个有序链表,合并两个有序链表,得到排序后的链表,返回链表头节点。
class Solution {
public:
    //876  链表的中间结点(快慢指针)
    ListNode *middleNode(ListNode *head){
        ListNode *pre = head;
        ListNode *slow = head;
        ListNode *fast = head;
        while(fast && fast->next){
            pre = slow;
            slow = slow->next;
            fast = fast->next->next;
        }
        pre->next = nullptr;
        return slow;
    }
    //  合并两个有序链表
    ListNode *mergeTwoLists(ListNode *list1,ListNode *list2){
        ListNode dummy;
        ListNode *cur = &dummy;
        while(list1 && list2){
             if(list1->val < list2->val){
                cur->next = list1;
                list1 = list1->next;
             }else{
                cur->next = list2;
                list2 = list2->next;
             }
             cur = cur->next;
        }
        cur->next = list1 ? list1:list2;
        return dummy.next;
    }

    ListNode* sortList(ListNode* head) {
        if(head==nullptr || head->next == nullptr){
            return head;
        }
        ListNode * head2 = middleNode(head);
        head = sortList(head);
        head2 = sortList(head2);

        return mergeTwoLists(head,head2);
    }
};
 
 
力扣215题.数组中的第k个最大元素
使用编程语言的内置排序算法对数组nums进行排序,然后返回第N-k个元素即可。
class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        sort(nums.begin(),nums.end());
        return nums[nums.size()-k];
    }
};
 
力扣221题最大正方形
 思路和力扣72题编辑距离,还有力扣5题最长回文子串类似。
class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {
        int m = matrix.size(),n = matrix[0].size(),ans = 0;
        vector<vector<int>>dp(m,vector<int>(n));
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(matrix[i][j] =='1'){
                    if(i==0 || j==0){
                        dp[i][j] = 1;
                    }else{
                        dp[i][j] = min(dp[i-1][j],min(dp[i][j-1],dp[i-1][j-1]))+1;
                       
                    }
                    ans = max(ans,dp[i][j]);
                }
            }
        }
        return ans * ans;
    }
};
 
 
 
力扣287题 寻找重复数
 使用哈希表法记录数组的各个数字,当查找重复数字则直接返回。
1.初始化:新建HashSet,记为hmap。
2.遍历数组nums中的每个数字num:
(1)当num在hmap中,说明重复,直接返回num。
(2)将num添加至hmap中。
3.返回-1。本题中一定有重复数字,因此这里返回多少都可以。
class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        unordered_map<int,bool>map;
        for(int num:nums){
            if(map[num]) return num;
            map[num] = true;
        }
        return -1;
    }
};
 
 
 
 
力扣 437题.路径总和III
思想和112题,113题很类似
思路:
1.先序递归 遍历每个节点
2.以每个节点作为起始节点DFS寻找满足条件的路径
先调用dfs函数从root开始查找路径,再调用pathsum函数到root左右子树开始查找。
class Solution {
public:
    int rootSum(TreeNode *root,long long targetSum){
        if(root==nullptr){
            return 0;
        }
        int ret = 0;
        if(root->val==targetSum){
            ret++;
        }
        ret += rootSum(root->left,targetSum-root->val);
        ret += rootSum(root->right,targetSum-root->val);
        return ret;
    }
    int pathSum(TreeNode* root, int targetSum) {
        if(root==nullptr){
            return 0;
        }
        int ret = rootSum(root,(long long)targetSum);
        ret += pathSum(root->left,targetSum);
        ret += pathSum(root->right,targetSum);
        return ret;
    }
};
 
 
 
 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/923940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实用指南:渗透测试入门:从网络抓包到Web安全基础

实用指南:渗透测试入门:从网络抓包到Web安全基础2025-10-01 14:38 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displ…

笔记本电脑重装系统后找不到5G WIFI无线网或蓝牙模块消失的解决方案

问题描述:笔记本电脑,重装系统后,蓝牙模块消失,且无线网显示不了5G校园网WIFI 问题解决: 电脑品牌网站下载更新驱动(如我的是联想服务官网https://newsupport.lenovo.com.cn/driveDownloads_index.html)1 查询并…

网站建设实施规范青岛市网页设计公司

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 &#x1f506; OpenCV项目地址及源代码&#xff1a;点击这里 文章目录 图像模糊操作均值滤波高斯滤波中值滤波双边滤波 图像模糊操作 关于图片的噪声&#xff1a;指的是图片中存在的不必要或者多余的干扰数…

完整教程:降低fullgc停顿时间

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

AI+传统工作流:Photoshop/Excel的智能插件开发指南 - 实践

AI+传统工作流:Photoshop/Excel的智能插件开发指南 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consol…

菜鸟坚持记录-开头篇

这个世界上有两种事:一种是你能掌控的,另一种是你不能掌控的。我们只能做好我们能掌控的事,而对于我们掌控不了的事,不用太关注,也不用太在意。 人生匆匆百年,如梦幻泡影。人活在这个世界上是为了什么?无非是走…

菜鸟坚持记录-开头篇

这个世界上有两种事:一种是你能掌控的,另一种是你不能掌控的。我们只能做好我们能掌控的事,而对于我们掌控不了的事,不用太关注,也不用太在意。 人生匆匆百年,如梦幻泡影。人活在这个世界上是为了什么?无非是走…

淄博网站建设hiddd网站发展历程

题目有39级台阶&#xff0c;每一步只能走1阶或者2阶。如果需要走偶数步&#xff0c;求上台阶的方案数。分析拿到题目就是一通分析&#xff0c;39是奇数&#xff0c;一次走1阶或者两阶。。。那么就有&#xff1a;1*x2y39&#xff0c;x得是个奇数。。。要求走偶数步&#xff0c;那…

Typora 笔记迁移 Obsidian 图片附件库批量移动方法,适用于笔记整理。

解决了Typora 笔记迁移 Obsidian 图片附件库批量移动问题,在ypora 笔记迁移 Obsidian 图片附件库过程中,之前的笔记都是采用的相对路径方法,而现在准备采用`wiki`索引方法,因此得检查不能是否冲突,对文件夹(含子文…

小学网站建设报告闵行网页设计培训学校

概念 A服务调用B服务,B服务调C服务,C服务调D服务,即微服务之间的通信(也可以叫微服务之间的调用) HTTP同步通信 一种轻量级的通信协议,常用于在不同的微服务之间进行通信,也是最简单的通信方式使用REST ful为开发规范&#xff0c;将服务对外暴露的HTTP调用方式为REST API(如GET…

2025年确有专长培训权威推荐榜:专业资质与特色诊疗口碑之选

2025年确有专长培训权威推荐榜:专业资质与特色诊疗口碑之选 中医药作为我国独特的医疗资源,近年来在政策支持与市场需求的双重推动下蓬勃发展。确有专长医师作为中医药服务体系中的重要组成部分,其专业能力与诊疗水…

开源 C# 快速构建(五)自定义控件--仪表盘

开源 C# 快速构建(五)自定义控件--仪表盘pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

2025中医师承培训、考试、认证机构权威推荐榜:名师传承与临床实践口碑之选

2025中医师承培训、考试、认证机构权威推荐榜:名师传承与临床实践口碑之选 在中医药事业蓬勃发展的今天,中医师承教育作为传统医学传承的重要方式,正受到越来越多从业者的关注与重视。随着国家对中医药传承创新支持…

建设监督网站阜城网站建设代理

1.筛选需求的报告id 基于REAC14Q4文件,筛选出需求报告的id,该文件格式如下&#xff0c;其中pt字段描述了患者在事件中所有的不良信息&#xff0c;注意此处一个报告id可以对应复数条信息。 primaryid$caseid$pt$drug_rec_act 初步统计约有4500种不良反应&#xff0c;总计60W条数…

什么网站做蔬菜生鲜比较好向客户介绍网站建设

一篇word文档&#xff0c;内容有大的章&#xff0c;小的节。如何把章节抽出来生成目录&#xff1f;WORD →点击需要插入的地方 → 插入菜单 → 索引和目录 → 目录 → 确定目录通常是长文档不可缺少的部分&#xff0c;有了目录&#xff0c;用户就能很容易地知道文档中有什么内容…

【Linux系列】让 Vim “跑”起来:建立一个会动的进度条

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网上自己建网站网站建设合同建设方注意事项

来源&#xff1a;国防科技要闻据悉&#xff0c;俄罗斯地面部队已完成“木船”&#xff08;Kungas&#xff09;机器人系统样机的国家试验&#xff0c;将于2020年开始部署部队&#xff0c;用于作战试验。发展背景自2010年以来&#xff0c;俄罗斯机器人系统进入快速发展时期。2014…

网站空间商是什么图书馆网络规划与设计

Problem: 354. 俄罗斯套娃信封问题 文章目录 思路解题方法复杂度Code 思路 这个问题可以转换为最长递增子序列&#xff08;Longest Increasing Subsequence&#xff0c;LIS&#xff09;问题。先对信封按宽度升序排序&#xff0c;当宽度相同时&#xff0c;按高度降序排序。然后在…

天津建设工程评标专家网站怎么用ps制作个人网站模板下载

31.《危险化学品安全管理条例》所称重大危险源,是指生产、储存、使用或者搬运危险化学品,且危险化学品的数量等于或者超过&#xff08;&#xff09;的单元(包括场所和设施)。 A.标准 B.一定量 C.临界量 答案&#xff1a;C 32.《危险化学品生产企业安全生产许可证实施办法》…