LeetCode第一天(实际第二天)

Leetcode-How-What 力扣Leetcode刷题指南 Leetcode-How-What 力扣Leetcode刷题指南 About the way how to use Leetcode wisely for preparing the interview and the solutions to some Leetcode problems’. 怎样为准备面试机智聪明的刷题(高效刷题)以及一些题目的题解。 同 github 链接: https:/... 阅读详情

写在前面:题目来源于剑指offer,有些题解也是offer中的,所以想看的更加详细,请直接在LeetCode上搜索

问题一:单词长度的最大乘积

题目:给定一个字符串数组 words,请计算当两个字符串 words[i] 和 words[j] 不包含相同字符时,它们长度的乘积的最大值。假设字符串中只包含英语的小写字母。如果没有不包含相同字符的一对字符串,返回 0。

题目拆解:

1)找到两个不包含相同字符的字符串

2)计算字符串长度的乘积

初始思路:

四层for循环,遍历所有结果

        int ans = 0;

        for(int i =0;i<words.size() - 1;++i)

        {

            for (int j = i + 1; j < words.size(); ++j)

            {

                bool sign = true;

                //判断 两个字符是否存在相等字母

                int w1 = words[i].size(), w2 = words[j].size();

                int nsize = min(w1, w2);

                for (int k = 0; k < w1; ++k)

                {

                    for(int m = 0; m < w2; ++m)

                    {

                        if (words[i][k] == words[j][m])

                        {

                            sign = false;

                            break;

                        }

                    }

                    if(!sign)

                    {

                        break;

                    }

                }

                int temp = w1 * w2;

                if (sign && ans < temp)

                    ans = temp;

            }

        }

        return ans;

测试结果:超出时间限制。

优化思路:

1)减少比较时间。测试用例中,超出时间的原因是,每个字符串都是相同字符,而且特别长。同时从题目中也可以发现,字符串的输入范围是26个小写字母,可以借助位运算简化比较过程。

示例“abc” = 0000...0111;“abbc” = 0000...0111;

一开始想半天不知道如何用位运算表达,看了题解才发现如此简单,学无止境。

       int sumlen = words.size();

        int i =0,j=0;

        vector<int> maskdata(sumlen,0);

        for(i = 0; i<sumlen;++i)

        {

            for(j = 0; j<words[i].size(); ++j)

            {

                maskdata[i] |= (1<<(words[i][j] - 'a'));

            }

        }

        int ans = 0;

        for(i =0;i<words.size() - 1;++i)

        {

            for (j = i + 1; j < words.size(); ++j)

            {

                int w1 = words[i].size(), w2 = words[j].size();

                int temp = w1 * w2;

                // 比当前答案大才有计算的必要

                if(temp < ans)

                    continue;

                // 判断是否存在相同字符

                if(maskdata[i] & maskdata[j])

                    continue;

                // 更新答案

                ans = temp;

            }

        }

        return ans;

上述代码是看过题解之后自己编写的,算是一点点自己的东西,哈哈,又是无效学习的一天。

此时我已经想不到优化的方向了,所以继续看题解:

题解中的优化是考虑到了mask重复的问题,进行减少计算,但是大方向并没有改变,因此并不是另一种思路。

启示:位运算也可以做去重复的操作。

题目二:排序数组中两个数字之和

给定一个已按照 升序排列  的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target

解题思路:

问题定性为查找问题,而且已知数组为升序数组,所以目标应该进一步细化为减少搜索任务上,因此,我的第一个思路为遍历数组,有序从数组中取值与target作差,在数组中通过二分法查找差值。

        int first = 0;

        int nsize = numbers.size();

        for(first = 0; first < nsize; ++first)

        {

            int ohalf = target - numbers[first];

            int bl = first +1;

            int br = nsize - 1;

            while(bl<=br)

            {

                int mid = bl + ( (br - bl) >> 1);

                if(numbers[mid] == ohalf)

                    return {first, mid};

                else if(numbers[mid] > ohalf)

                    br = mid - 1;

                else

                    bl = mid + 1;

            }

        }

        return {0};

编写过程中自己的问题是,二分查找的判断条件,左边边界是小于等于还是小于,如果是小于,则跳出while循环时还需要讨论左边是否等于右边界的情况。

还有一个思维误区是判断是否加1的问题,在选择小于的情况下,如何解决3和4反复横跳的问题。一直陷在思维误区,因此以后遇到二分查找问题,只需要考虑数据即可

查找模式

int bl = 查找起始位置

int br = 查找结束位置

while(bl <= br)

{

        int mid = bl + ( (br - bl) >> 1);

        if(等于中间值)

        else if(大于中间值)

                mid + 1

        else 小于中间值

                mid - 1

}

现在做题做的比较少,先这样考虑,遇到新问题再回来修改(2022.8.1)

昨天临走,又发现双指针方法也适合有序数组的查找

        int bl = 0;

        int br = numbers.size() - 1;

        while(bl < br)

        {

            if(numbers[bl] + numbers[br] == target)

                return {bl,br};

            else if(numbers[bl]+numbers[br]>target)

                br -=1;

            else

                bl +=1;

        }

        return {0};

总结:

二分查找、双指针、位运算去重

力扣(Leetcode)第1题:两数之和(C语言版本) 题目: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。 示例 1: 输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。 示例 2: 输入:nums = [3,2,4], target = 6 阅读详情

相关推荐

刷力扣 LeetCode 算法题需要充值会员吗?

刷力扣算法题,需要充值会员吗?我的体验是会!为什么?请看文章

负雪明烛 1万+

面试算法5:单词长度的最大乘积

输入一个字符串数组words,请计算不包含相同字符的两个字符串words[i]和words[j]的长度乘积的最大值。如果所有字符串都包含至少一个相同字符,那么返回0。假设字符串中只包含英文小写字母。例如,输入的字符串数组words为[“abcw”,“foo”,“bar”,“fxyz”,“abcdef”],数组中的字符串"bar"与"foo"没有相同的字符,它们长度的乘积为9。"abcw"与"fxyz"也没有相同的字符,它们长度的乘积为16,这是该数组不包含相同字符的一对字符串的长度乘积的最大值。

Winn~ 372

一文掌握SourceTree使用(超级详细)

SourceTree是一款开源的代码仓库客户端工具,界面美观,操作简单,具有代码克隆、本地创建、提交代码、撤销修改,拉取(pull)代码、上传(push)代码、合并分支等操作。对于软件开发人员是一款必备的应用软件。

GM_115的博客 3万+

318. 最大单词长度乘积-将单词转化为位运算

给定一个字符串数组words,找到length(word[i]) * length(word[j])的最大值,并且这两个单词不含有公共字母。你可以认为每个单词只包含小写字母。如果不存在这样的两个单词,返回 0。 示例1: 输入: ["abcw","baz","foo","bar","xtfn","abcdef"] 输出: 16 解释: 这两个单词为 "abcw", "xtfn"。 示...

嗑盐工作室 361

ROS相机内参标定详细步骤指南

相机标定的目的是为了确定相机内部参数和外部参数,以便修正图像并将图像坐标映射到世界坐标,或者从世界坐标映射到图像坐标。这个过程是计算机视觉和三维感知任务的关键步骤之一,它有以下主要目的: 1. **减小畸变**:相机镜头和传感器可能引入径向和切向畸变,使得图像中的直线变得弯曲或者物体的形状不准确。通过标定相机,可以矫正这些畸变,使图像更准确。

m0_56661101的博客 1万+

腾讯ACE反作弊系统:内核驱动与AI行为分析如何守护游戏公平

在游戏安全领域,反作弊技术是保障公平竞技环境的核心防线。其基本原理是通过监控系统关键行为,识别并阻断非法的第三方程序干预。从技术实现看,现代反作弊方案普遍采用分层防御架构,结合用户态模块进行应用层检测,并依赖内核态驱动实现底层深度监控,以此构建纵深防御体系。这种技术的核心价值在于,它能有效对抗从简单内存修改到高级驱动级作弊等多种威胁,维护游戏经济系统和玩家体验的完整性。随着作弊手段的演进,行为分析与AI赋能变得至关重要,系统通过机器学习模型分析进程行为序列的异常模式,即使面对未知特征的外挂变种也能进行有效识

weixin_33978578的博客 741

单词长度的最大乘积

题目: 输入一个字符串数组words,请计算不包含相同字符的两个字符串words[i]和words[j]的长度乘积的最大值。如果所有字符串都包含至少一个相同字符,那么返回0。假设字符串中只包含英文小写字母。例如,输入的字符串数组words为[“abcw”,“foo”,“bar”,“fxyz”,“abcdef”,],数组中的字符串"bar"与"foo"没有相同的字符,他们长度的乘积为9。"abcw"与"fxyz"也没有相同的字符,它们长度的乘积为16,这是该数组不包含相同字符的一对字符串的长度乘积的最大值。.

m0_53245772的博客 267

飞牛NAS+Docker打造私人IPTV直播源:手把手教你部署iptv-api

本文详细介绍了如何在飞牛NAS上通过Docker部署iptv-api,打造私人IPTV直播源。从SSH配置到Docker容器部署,手把手教你实现自动更新直播源、多终端支持的解决方案,适用于Kodi、PotPlayer等播放器,提升家庭娱乐体验。

earth的博客 5575

【leetcode】单词长度的最大乘积

字符串操作、位运算、计数优化

weixin_44627672的博客 305

yolov5改进之Fasternet主干网络替换

fasternet替换yolov5主干网络

qq_41920323的博客 5143

【AgentScope 2.0】01-不搭 demo,直接解剖一个生产级 Agent 平台:loser-agent 全链路地图

本文介绍生产级Agent平台loser-agent的完整请求旅程,从用户发消息到返回结果共七站:入口鉴权、灰度路由、Agent装配、模型路由、工具执行、持久化与流式响应。课程以真实源码为线索,深入剖析每一步实现逻辑,涵盖灰度发布、权限控制、HITL审批、多模态处理、状态持久化等核心能力。强调框架仅负责Agent运行时语义,平台自建管理请求生命周期中所有非框架部分,适合Java后端开发者系统掌握Agent工程化落地。

loser.with.m的博客 724

LeetCode使用简介(leetcode中国-力扣)

没有入过英文版官网的坑,现在中文版官网也出来许久并且已经比较完善,题库也是通的,现在就直接使用LeetCode中国。 经过测试,到2019.11账号还是不通的,使用在中文版注册的账号密码是无法登陆英文版的,都绑定并使用github登录得到的不同的账号。能查到的18年的关于leetcode账号数据同步到leetcode中国的帖子,因为18年leetcode中国才刚刚出现还有很多不完善的地方,不太好使...

Sophia_fez的博客 1万+

【TRAE调教指南之MCP篇】Context 7 MCP:让AI永远拥有最新技术文档

【TRAE调教指南之MCP篇】Context 7 MCP:让AI永远拥有最新技术文档

funfan的博客 1314

LeetCode 力扣算法题解汇总,All in One

我刷过的所有 leetcode 算法题解的汇总。 题目的排列顺序是按照先Easy再Medium再Hard排列的,暂时还没有把题目全部整理完成。后序我会把刷过的所有的题目都整理到这个文档里。 如果想看我全部的力扣算法题解,可以看我的题解博客:[fuxuemingzhu.cn](fuxuemingzhu.cn)

负雪明烛 1万+

【C++】构造函数之初始化列表(Initialization list of constructors)

本讲主要是构造函数的初始化列表的讲节,但是本节很重要,可以关乎后面写项目

m0_62599305的博客 2233

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

在 vscode 上刷力扣 Leetcode 可以这样来

用vscode刷LeetCode算法,其乐无穷

梦幻通灵 3万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【LeetCode】力扣刷题记录第一天

[LeetCode]边刷题边学习

2301_77031350的博客 1077

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【力扣 | SQL题 | 每日3题】力扣1097,1149,1070

1hard + 2 mid,难度还行,当做练手。

2301_80912559的博客 1548

1097. 游戏玩法分析 V - 力扣(LeetCode)

玩家 1 和 3 在 2016-03-01 安装了游戏,但只有玩家 1 在 2016-03-02 重新登录,所以 2016-03-01 的第一天留存率是 1/2=0.50。玩家 2 在 2017-06-25 安装了游戏,但在 2017-06-26 没有重新登录,因此 2017-06-25 的第一天留存率为 0/1=0.00。:首先,我们需要确定每个玩家的安装日期,即他们第一次登录游戏的日期。:对于每个安装日期,我们需要计算在安装日期的第二天登录的玩家数量。:使用留存玩家数量除以新玩家数量,得到留存率。

qq_58114907的博客 1154

【PythonCode】力扣Leetcode26~30题Python版

力扣26-30

weixin_43790276的博客 2013

【LeetCode面试TOP100】力扣打卡第一天!

LeetCode30天训练计划第一天!

冲击大厂之路!!! 1587

力扣打卡第二天

1 ... n。

JUIU9527的博客 438

leetcode数据结构题解(Java实现,第一天和第二天)

其次本题采用第三种遍历方式:即以某个节点为尾的所有字串进行遍历和,假设有数组nums,且dp[i],表示以第i个数为尾的子串和,则dp[i]=dp[i-1]+nums[i],而要使得dp[i]是最大的子串的话,就要分在遍历的过程中,如果dp[i-1]为负数,则以第i个数为结尾的字串和即为本身,因为nums[i]加上一个负数都会使得整体值小于nums[i];1.以某个节点为头的所有子序列,如数组[a,b,c,e],以a为头的字串为【a】,【a,b】,【a,b,c】,【a,b,c,d】;代码(力扣模板模式)

LGL 1067

掌握这15种模式后,力扣(LeetCode)不再难

在掌握这15种模式之前,力扣(LeetCode)对我来说一直很难。

硅基创想家的博客 4312

【PythonCode】力扣Leetcode31~35题Python版

力扣31-35

weixin_43790276的博客 2080
下一篇: ACM输入接口合集
FlyingFish7
博客等级 码龄9年 7粉丝 2原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值