怒刷LeetCode的第27天(Java版)

news2024/11/25 22:28:11

目录

第一题

题目来源

题目内容

解决方法

方法一:位运算

第二题

题目来源

题目内容

解决方法

方法一:贪心算法

第三题

题目来源

题目内容

解决方法

方法一:二分查找

方法二:牛顿迭代法

方法三:位操作


第一题

题目来源

67. 二进制求和 - 力扣(LeetCode)

题目内容

解决方法

方法一:位运算

class Solution {
public String addBinary(String a, String b) {
        StringBuilder result = new StringBuilder();
        int carry = 0;
        int i = a.length() - 1;
        int j = b.length() - 1;
        
        while (i >= 0 || j >= 0) {
            int sum = carry;
            
            if (i >= 0) {
                sum += a.charAt(i--) - '0';
            }
            
            if (j >= 0) {
                sum += b.charAt(j--) - '0';
            }
            
            result.append(sum % 2);
            carry = sum / 2;
        }
        
        if (carry > 0) {
            result.append(carry);
        }
        
        return result.reverse().toString();
    }
}

在这个方法中,我们使用 StringBuilder 来保存计算结果。然后,通过两个指针 i 和 j 分别从两个输入字符串的末尾开始遍历。在每一位上,我们将对应位置上的字符转换为数值,并加上上一位的进位值。然后,根据和的奇偶性确定当前位的值,并更新进位值。最后,如果还有进位值剩余,则添加到结果的最前面。最后将结果翻转并转换为字符串返回。

复杂度分析:

时间复杂度:

  1. 在上述代码中,我们使用了两个指针 i 和 j 分别遍历两个输入字符串的末尾。因此,时间复杂度为O(max(m, n)),其中m和n分别是字符串a和b的长度。
  2. 另外,我们使用了一个StringBuilder来保存结果,最后还需要将其翻转。这些操作的时间复杂度均为O(max(m, n))。
  3. 综上所述,该方法的时间复杂度为O(max(m, n))。

空间复杂度:

  • 对于空间复杂度,我们仅使用了一个StringBuilder对象来保存结果。因此,空间复杂度为O(max(m, n)),主要取决于输入字符串较长的那个长度。

需要注意的是,这里使用了StringBuilder来构建字符串,而不是直接拼接字符串。这是因为字符串的拼接操作会生成新的字符串对象,并且每次拼接都需要将原字符串复制到新的对象中。而StringBuilder则是基于可变数组实现的,可以高效地进行字符串拼接操作。因此,使用StringBuilder可以提高性能。

LeetCode运行结果:

第二题

题目来源

68. 文本左右对齐 - 力扣(LeetCode)

题目内容

解决方法

方法一:贪心算法

这道题可以采用贪心的思路,每次尽可能选取更多的单词,同时尽量均匀分配单词之间的空格数量。

具体实现可以按行来处理,每次选取一些单词使得它们加起来不超过给定的 maxWidth,然后根据单词数量和剩余空格数量来决定如何分配单词之间的空格。如果当前行只有一个单词,那么左对齐;如果是最后一行,则左对齐且单词之间只加一个空格;否则就尽可能均匀分配单词之间的空格数量即可。

具体实现可以使用两个指针 i 和 j 分别表示当前行的第一个和最后一个单词,每次从 i 开始向后扫描单词,直到扫描到一个单词会导致当前行的长度超过 maxWidth 为止。此时,i 到 j-1 这些单词就组成了当前行,可以根据上述规则来对它们进行排版。最后将结果添加到答案中并继续扫描下一行。

class Solution {
    public List<String> fullJustify(String[] words, int maxWidth) {
        List<String> res = new ArrayList<>();
        int n = words.length;
        int i = 0;
        while (i < n) {
            int len = 0; // 当前行已选单词的长度
            int wordsNum = 0; // 当前行已选单词的数量
            StringBuilder sb = new StringBuilder();
            while (i < n && len + words[i].length() + wordsNum <= maxWidth) {
                // 选取单词
                len += words[i].length();
                wordsNum++;
                i++;
            }
            if (wordsNum == 1) { // 如果当前行只有一个单词,左对齐
                sb.append(words[i - wordsNum]);
                for (int j = 0; j < maxWidth - len; j++) {
                    sb.append(" ");
                }
            } else if (i == n) { // 如果是最后一行,左对齐且单词之间只加一个空格
                for (int j = i - wordsNum; j < i; j++) {
                    sb.append(words[j]);
                    if (j < i - 1) {
                        sb.append(" ");
                    }
                }
                for (int j = 0; j < maxWidth - len - (wordsNum - 1); j++) {
                    sb.append(" ");
                }
            } else { // 否则,尽可能均匀分配单词间的空格数量
                int spaces = maxWidth - len;
                int slots = wordsNum - 1;
                int spaceWidth = spaces / slots;
                int remain = spaces % slots;
                for (int j = i - wordsNum; j < i; j++) {
                    sb.append(words[j]);
                    if (j == i - 1) {
                        break;
                    }
                    for (int k = 0; k < spaceWidth; k++) {
                        sb.append(" ");
                    }
                    if (remain > 0) {
                        sb.append(" ");
                        remain--;
                    }
                }
            }
            res.add(sb.toString());
        }
        return res;
    }
}

复杂度分析:

时间复杂度分析:

假设单词数量为 n,最大长度为 L。

扫描一遍单词数组找出每一行的单词需要 O(n) 的时间复杂度,对于每一行,排版时需要根据单词数量和剩余空格数量来决定如何分配单词之间的空格,这一步需要 O(L) 的时间复杂度。因此总时间复杂度为 O(nL)。

空间复杂度分析:

算法中使用了一个 StringBuilder 对象来存储当前行的字符串,以及一个 List<String> 类型的数组来存储所有排版后的字符串,因此空间复杂度为 O(nL),其中n为单词数量,L为最大单词长度。

LeetCode运行结果:

第三题

题目来源

69. x 的平方根 - 力扣(LeetCode)

题目内容

解决方法

方法一:二分查找

题目要求计算一个非负整数x的算术平方根,并返回整数部分。

可以使用二分查找的方法来逼近平方根的整数部分。假设平方根的整数部分为r,那么可以将问题转化为在区间[0, x]中查找一个数r,使得rr<=x且(r+1)(r+1)>x。可以通过二分查找在有序区间中查找满足条件的数。

class Solution {
    public int mySqrt(int x) {
        if (x == 0) {
            return 0;
        }
        
        long left = 1;
        long right = x;
        
        while (left <= right) {
            long mid = left + (right - left) / 2;
            
            if (mid * mid == x) {
                return (int)mid;
            } else if (mid * mid < x) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        
        return (int)right;
    }
}

复杂度分析:

  • 时间复杂度:二分查找的时间复杂度为O(logN),其中N为x的值。每次迭代将搜索范围缩小一半,因此需要的迭代次数为O(logN)。
  • 空间复杂度:只使用了常数级别的额外空间,空间复杂度为O(1)。

LeetCode运行结果:

方法二:牛顿迭代法

除了二分查找,还可以使用牛顿迭代法来求解平方根。

牛顿迭代法的思想是通过不断逼近函数的零点来求解方程的根。对于求解平方根的问题,可以将其转化为求解方程 f(r) = r^2 - x = 0 的根。根据牛顿迭代法的迭代公式,可以得到如下的迭代过程:

r_{n+1} = r_n - f(r_n) / f'(r_n)

其中,r_n 是第 n 次迭代得到的近似解,f'(r_n) 是 f(r_n) 的导数。

对于平方根的问题,迭代公式可以简化为:

r_{n+1} = (r_n + x / r_n) / 2

class Solution {
    public int mySqrt(int x) {
        if (x == 0) {
            return 0;
        }
        
        double r = x;
        while (Math.abs(r * r - x) > 0.0001) {
            r = (r + x / r) / 2;
        }
        
        return (int)r;
    }
}

复杂度分析:

  • 时间复杂度:牛顿迭代法通常会在较少的迭代次数内收敛,因此时间复杂度可以看作是常数级别的,即 O(1)。
  • 空间复杂度:只使用了常数级别的额外空间,空间复杂度为 O(1)。

LeetCode运行结果:

方法三:位操作

除了二分查找和牛顿迭代法,还可以使用位操作的方法来求解平方根。

我们可以从二进制的角度思考,一个非负整数 x 的平方根的整数部分最大不会超过 x 的一半。因此,我们可以从 0 到 x/2 这个范围内进行搜索。

具体思路如下:

  1. 如果 x 为 0 或 1,直接返回 x。
  2. 初始化左边界 left 为 0,右边界 right 为 x / 2。
  3. 在循环中进行二分搜索:
    • 计算中间值 mid = (left + right) / 2。
    • 比较 mid * mid 和 x 的大小关系:
      • 如果 mid * mid == x,返回 mid。
      • 如果 mid * mid > x,说明 mid 太大,将右边界 right 更新为 mid - 1。
      • 如果 mid * mid < x,说明 mid 可能是解,将左边界 left 更新为 mid + 1,并记录最近一个满足 mid * mid <= x 的数。
  4. 返回最近满足 mid * mid <= x 的数。
class Solution {
    public int mySqrt(int x) {
        if (x == 0 || x == 1) {
            return x;
        }
        
        int left = 0;
        int right = x / 2;
        
        int ans = 0;
        while (left <= right) {
            int mid = (left + right) / 2;
            
            long square = (long)mid * mid;
            if (square == x) {
                return mid;
            } else if (square < x) {
                ans = mid;
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        
        return ans;
    }
}

复杂度分析:

  • 时间复杂度:由于二分搜索的时间复杂度为 O(logN),其中 N 为 x 的值,因此该方法的时间复杂度为 O(logN)。
  • 空间复杂度:只使用了常数级别的额外空间,空间复杂度为 O(1)。

LeetCode运行结果:

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

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

相关文章

基于Pytest接口自动化的requests模块项目实战以及接口关联方法详解

1、基于pytest单元测试框架的规则 1.1 模块名&#xff08;即文件名&#xff09;必须以test_开头或者_test结尾 1.2 类名必须以Test开头且不能有init方法 1.3 用例名&#xff08;测试方法&#xff09;必须以test开头 同时&#xff0c;我也为大家准备了一份软件测试视频教程&…

【算法-动态规划】零钱兑换 II-力扣 518

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

Smartforms 打印出现的问题

上半年ECC做了升级 程序代码从ECC迁移到S4 有用户反馈 打印不能用了 经过调试发现在打印程序中 竟然返回2&#xff0c;但是 smartforms ZRPT_CO_YFLL_DY又是存在的 。 然后去激活 并与 ECC对比发现问题 S4的页大小竟然这么小 找到对应的页格式 对比ECC和S4 果然是这个…

2023年中国商用服务机器人行业发展概况分析:国产机器人厂商向海外进军[图]

商用服务机器人指在非制造业的商用服务场景中&#xff0c;用来替代或辅助人类进行服务性质工作的机器人&#xff1b;常见的商用场景中&#xff0c;商用服务机器人主要分为终端配送类机器人&#xff0c;商用清洁类机器人&#xff0c;引导讲解类机器人等&#xff0c;被广泛应用在…

7+线粒体相关基因预后模型+肿瘤微环境+免疫细胞浸润+实验验证

今天给同学们分享一篇线粒体预后模型实验的生信文章“Constructing a novel mitochondrial-related gene signature for evaluating the tumor immune microenvironment and predicting survival in stomach adenocarcinoma”&#xff0c;这篇文章于2023年3月13日发表在J Trans…

Spring Boot 生成二维码

效果图 1.maven依赖 <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId>

力扣 095. 最长公共子序列(C语言+动态规划)

1. 题目 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08…

强化学习

文章目录 强化学习概念Model-FreeValue-based learningDQN State-based learning蒙特卡洛近似 Actor-Critic LearningModel-BasedMonte Carlo TreeSearch(MCTS)-AlphaGo 强化学习概念 Terminologies&#xff08;术语&#xff09; State s&#xff1a;环境的一个状态Agent &…

程 控 电 源1761程控模块电源

程 控 电 源 1761程控模块电源 1761程控模块电源是在自动测试环境中提供偏置功率和对部件或最终产品提供激励的理想设备&#xff0c;是测试系统必备的测试仪器。适用于研发、设计、生产制造等自动测试领域。 1761程控模块电源为用户选配电源提供了灵活性&#xff0c;根据需要…

27岁,准备转行做网络安全渗透,完全零基础,有前途吗?

你该不该转行的问题一样&#xff0c;都是你自己的人生选择&#xff0c;怎能听人一面之词&#xff1f; 所以转行一定要想清楚&#xff0c;对自身的实力做好清晰的估算&#xff0c;换个赛道重新开始、从头再来的话&#xff0c;那么我建议你考虑“网络安全”&#xff0c;前景好薪…

CSS 轮廓(outline)

轮廓&#xff08;outline&#xff09;是绘制于元素周围的一条线&#xff0c;位于边框边缘的外围&#xff0c;可起到突出元素的作用。 轮廓&#xff08;outline&#xff09;属性指定元素轮廓的样式、颜色和宽度。 CSS 轮廓&#xff08;outline&#xff09; 轮廓&#xff08;ou…

关于网络协议的若干问题(五)

1、DH 算法会因为传输随机数被破解吗&#xff1f; 答&#xff1a;DH 算法的交换材料要分公钥部分和私钥部分&#xff0c;公钥部分和其他非对称加密一样&#xff0c;都是可以传输的&#xff0c;所以对于安全性是没有影响的&#xff0c;而且传输材料远比传输原始的公钥更加安全。…

Vue和React高级特性之传送

一、Vue中的Teleport 是一个内置组件&#xff0c;它可以将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去 试想下面这样的 HTML 结构&#xff1a; <div class"outer"><h3>Tooltips with Vue 3 Teleport</h3><div><M…

Zabbix 使用同一ODBC监控不同版本MySQL

一、ODBC介绍 ODBC是Open Database Connect 即开发数据库互连的简称&#xff0c;它是一个用于访问数据库的统一界面标准。ODBC引入一个公共接口以解决不同数据库潜在的不一致性&#xff0c;从而很好的保证了基于数据库系统的应用程序的相对独立性。ODBC 概念由 Microsoft 开发&…

【AI视野·今日Robot 机器人论文速览 第五十三期】Thu, 12 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Thu, 12 Oct 2023 Totally 25 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Pixel State Value Network for Combined Prediction and Planning in Interactive Environments Authors Sascha Rosbach, St…

Python学习记录——이십이 Bytes和字符集编码

文章目录 根据ANSI标准&#xff0c;各国对于各国的文字有自己的编写方法&#xff0c;中国发展的就是gbk编码&#xff0c;国际上有个unicode码&#xff0c;适用于所有语言&#xff0c;依据这个标准出来utf-8标准。像ascii&#xff0c;我们见到的就是8个bit位&#xff0c;总共存放…

SOP8封装 NV400F的语音芯片在电动车充电桩的应用

充电桩作为电动汽车的配套设施&#xff0c;为其提供充电服务&#xff0c;功能类似加油站里的加油机。一般安装在公共建筑和居民小区内供电动车车主使用。随着国家对节能减排和保护环境越来也重视。在城市中&#xff0c;新能源的电动车得到了空前的发展&#xff0c;电动汽车零污…

二十二、【形状工具组】

文章目录 基础图形多边形直线工具自定义形状工具 形状工具组画的图形是矢量图形&#xff0c;在放大和缩小后像素不变看起来不会模糊&#xff0c;位图和矢量图形的存储方式不一样&#xff0c;位图的存储方式是按各个像素的数据来进行存储的&#xff0c;而矢量图形是根据算法来进…

蓝桥杯——递增序列和货物摆放

文章目录 前言一、递增序列二、货物摆放总结 前言 多多练习 一、递增序列 解题思路&#xff1a; 代码实现&#xff1a; 当然我的这个代码也不是很正确 发这道题就是向大家集思广益&#xff0c;我的就只作为一个参考啦~ #include <stdio.h> #include <stdlib.h>…

【数据结构】排序--插入排序(希尔排序)

目录 一 基本思想 二 直接插入排序 三 希尔排序 一 基本思想 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为 止&#xff0c;得到一个新的有序序列 。 实际中我们玩扑克牌时&#xff0c;就用了插入排序的思想 二…