这次我只做对一题。

原因是题目返回值类型有误,写的是 String[] ,实际上应该返回 List<String>

好吧,只能自认倒霉。就当涨涨经验。


5068. 前后拼接

解题思路

大致思路是用两层循环检查每两个短语是否能前后拼接成新短语。如果可以前后拼接,那么将它们拼接成新短语,并添加到结果列表。最后将列表升序返回。

由于需要第一个单词和最后一个单词,因此需要先进行分割处理,将得到的第一个单词和最后一个单词分别保存。由于可以确定大小,因此直接用二维数组保存即可。

  1. // ht[i][0]表示第i个短语的第一个单词,ht[i][1]表示第i个短语的最后一个单词
  2. String[][] ht = new String[phrases.length][2]

1、短语 1 和短语 2,一种是 1 在前,2 在后,另一种是 2 在前,1 在后。

2、短语不能和自己前后拼接。

3、结果列表中的新短语不能重复,if 判断即可。

:返回值改为 List<String>

时间复杂度:双重 for 循环,故时间复杂度为 O(n2)。

空间复杂度:一个二维数组,一个列表,都和 n 有关,两个字符串 s。故空间复杂度为 O(n)。

Java代码
  1. class Solution {
  2. // 方法的返回值要改为List<String>,否则会报错
  3. public List<String> beforeAndAfterPuzzles(String[] phrases) {
  4. // 短语的第一个单词和最后一个单词
  5. String[][] ht = new String[phrases.length][2];
  6. // 分割短语,并获取第一个单词和最后一个单词
  7. for (int i = 0; i < phrases.length; ++i) {
  8. String[] phrase = phrases[i].split(" ");
  9. ht[i][0] = phrase[0];
  10. ht[i][1] = phrase[phrase.length - 1];
  11. }
  12. List<String> ans = new ArrayList<>();// 结果
  13. for (int i = 0; i < phrases.length; ++i) {
  14. for (int j = i + 1; j < phrases.length; ++j) {
  15. // 短语i的最后一个单词和短语j的第一个单词相同
  16. if (ht[i][1].equals(ht[j][0])) {
  17. String s = phrases[i];
  18. s += phrases[j].replaceFirst(ht[j][0], "");
  19. if (!ans.contains(s)) {// 确保新短语不重复
  20. ans.add(s);
  21. }
  22. }
  23. // 短语j的最后一个单词和短语i的第一个单词相同
  24. if (ht[j][1].equals(ht[i][0])) {
  25. String s = phrases[j];
  26. s += phrases[i].replaceFirst(ht[i][0], "");
  27. if (!ans.contains(s)) {
  28. ans.add(s);
  29. }
  30. }
  31. }
  32. }
  33. Collections.sort(ans);// 升序
  34. return ans;
  35. }
  36. }
提交结果


5070. 与目标颜色间的最短距离

解题思路

基本思路:

将三种颜色的下标分开保存,每种颜色的个数未知,采用 List,比较方便。

查询颜色 c 的列表中是否有下标 i,如果有,说明距离为 0,如果没有,就获取最近的距离。

查询部分:

  • 如果颜色 c 的列表为空,说明没有这种颜色,因此将 -1 添加到结果中。
  • 如果颜色 c 的列表不为空,说明有这种颜色。
    • 如果索引 i 的左边没有这种颜色,col.get(posR) - i 即为最近的距离。
    • 如果索引 i 右边没有这种颜色,i - col.get(posL) 即为最近的距离。
    • 如果两边都有这种颜色,取上面两个式子的最小值即为最近的距离。

时间复杂度:查询的循环里面有个二分查找,因此最坏的情况下,时间复杂度为 O(mlog(n))O(mlog(n))O(mlog(n))。

空间复杂度:两个链表,因此为 O(max(n,m))O(max(n,m))O(max(n,m))。

Java代码
  1. class Solution {
  2. // 返回值改为List<Integer>,否则编译出错
  3. public List<Integer> shortestDistanceColor( int[] colors,
  4. int[][] queries) {
  5. List<List<Integer>> color = new ArrayList<>();// 颜色1,2,3的列表
  6. for (int i = 0; i < 4; ++i) {
  7. color.add(new ArrayList<>());
  8. }
  9. for (int i = 0; i < colors.length; ++i) {
  10. color.get(colors[i]).add(i);// 将每种颜色的索引保存到对应的颜色列表
  11. }
  12. List<Integer> ans = new ArrayList<>();// 结果
  13. for (int[] querie : queries) {
  14. int i = querie[0];// 索引
  15. int c = querie[1];// 颜色
  16. List<Integer> col = color.get(c);// 颜色c的列表
  17. if (col.isEmpty()) {// 没有这种颜色
  18. ans.add(-1);// 不存在解决方案,添加-1
  19. continue;// 继续下一个查询
  20. }
  21. // 在颜色c的列表中查找值为i的索引
  22. int pos = Collections.binarySearch(col, i);
  23. if (pos >= 0) {// 找到
  24. ans.add(0);// 说明距离索引i最近的颜色c就是它自己(距离为0)
  25. continue;
  26. }
  27. // 未找到,pos表示第一个大于i的值的索引减1
  28. int posR = -pos - 1;// 第一个大于i的值的索引,范围是[0,col.size()]
  29. int posL = posR - 1;// 第一个小于i的值的索引
  30. if (posR == 0) {// 颜色c的所有索引都比i大,即索引i的左边没有颜色c
  31. ans.add(col.get(0) - i);// 最近的距离
  32. continue;
  33. }
  34. if (posR == col.size()) {// 颜色c的所有索引都比i小,即索引i的右边没有颜色c
  35. ans.add(i - col.get(posL));// 最近的距离
  36. continue;
  37. }
  38. // 索引i的左右都有颜色c,取最近的距离
  39. ans.add(Math.min(i - col.get(posL), col.get(posR) - i));
  40. }
  41. return ans;
  42. }
  43. }
提交结果


1183. 矩阵中 1 的最大数量

解题思路

参考https://leetcode.com/savevmk的代码。

暂时还没弄懂为什么可以这样做。感觉这个方法太巧妙了。

Java代码
  1. class Solution {
  2. public int maximumNumberOfOnes( int width,
  3. int height,
  4. int sideLength,
  5. int maxOnes) {
  6. int[] arr = new int[sideLength * sideLength];// 子阵的一维形式
  7. for (int i = 0; i < height; ++i) {
  8. for (int j = 0; j < width; ++j) {
  9. int row = i % sideLength;
  10. int col = j % sideLength;
  11. ++arr[row * sideLength + col];
  12. }
  13. }
  14. Arrays.sort(arr);// 升序
  15. int ans = 0;// 结果
  16. for (int i = 0; i < maxOnes; ++i) {
  17. ans += arr[arr.length - 1 - i];// 1的数量
  18. }
  19. return ans;
  20. }
  21. }
提交结果

LeetCode第8场双周赛(Java)的更多相关文章

  1. Java实现 LeetCode第30场双周赛 (题号5177,5445,5446,5447)

    这套题不算难,但是因为是昨天晚上太晚了,好久没有大晚上写过代码了,有点不适应,今天上午一看还是挺简单的 5177. 转变日期格式   给你一个字符串 date ,它的格式为 Day Month Yea ...

  2. LeetCode 第 15 场双周赛

    1287.有序数组中出现次数超过25%的元素 1288.删除被覆盖区间 1286.字母组合迭代器 1289.下降路径最小和 II 下降和不能只保留原数组中最小的两个,hacked. 1287.有序数组 ...

  3. LeetCode 第 14 场双周赛

    基础的 api 还是不够熟悉啊 5112. 十六进制魔术数字 class Solution { public: char *lltoa(long long num, char *str, int ra ...

  4. LeetCode第29场双周赛题解

    第一题 用一个新数组newSalary保存去掉最低和最高工资的工资列表,然后遍历newSalary,计算总和,除以元素个数,就得到了平均值. class Solution { public: doub ...

  5. leetcode-第11场双周赛-5089-安排会议日程

    题目描述: 自己的提交: class Solution: def minAvailableDuration(self, slots1: List[List[int]], slots2: List[Li ...

  6. leetcode-第11场双周赛-5088-等差数列中缺失的数字

    题目描述: 自己的提交: class Solution: def missingNumber(self, arr: List[int]) -> int: if len(arr) == 2: re ...

  7. leetcode-第五场双周赛-1134-阿姆斯特朗数

    第一次提交: class Solution: def isArmstrong(self, N: int) -> bool: n = N l = len(str(N)) res = 0 while ...

  8. leetcode-第五场双周赛-1133-最大唯一数

    第一次提交: class Solution: def largestUniqueNumber(self, A: List[int]) -> int: dict = {} for i in A: ...

  9. LeetCode 第 165 场周赛

    LeetCode 第 165 场周赛 5275. 找出井字棋的获胜者 5276. 不浪费原料的汉堡制作方案 5277. 统计全为 1 的正方形子矩阵 5278. 分割回文串 III C 暴力做的,只能 ...

随机推荐

  1. CSS行内块元素(内联元素)

    一.典型代表 input img 二.特点: 在一行上显示 可以设置宽高 <style type="text/css"> img{ width: 300px; /* 顶 ...

  2. [CSP-S 2019]格雷码

    [CSP-S 2019]格雷码 题目大意: 格雷码(Gray Code)是一种特殊的 \(n\) 位二进制串排列法,它要求相邻的两个二进制串间恰好有一位不同,特别地,第一个串与最后一个串也算作相邻. ...

  3. 基于Docker部署ETCD集群

    基于Docker部署ETCD集群 关于ETCD要不要使用TLS? 首先TLS的目的是为了鉴权为了防止别人任意的连接上你的etcd集群.其实意思就是说如果你要放到公网上的ETCD集群,并开放端口,我建议 ...

  4. #C++初学记录(动态规划 被3整除的子序列)

    原题:牛客网 动态规划dynamic programming 的入门级题目 题目描述 : 给你一个长度为50的数字串,问你有多少个子序列构成的数字可以被3整除 答案对1e9+7取模 输入描述: 输入一 ...

  5. Linux Shell:根据指定的文件列表 或 map配置,进行文件位置转移

    读取配置文件,进行文件位置转移 在whenb.csv中指定了需要从/home/root/cf/下移除到/home/root/cf_wh/下文件列表,whenb.csv中包含记录如下: enb- enb ...

  6. Protobuf多协议

    上一篇只有Person的message,如果多了一个message,如Dog,这样就会有问题. 解决方法: 定义多协议 一.定义proto文件 syntax = "proto2"; ...

  7. 微信小程序开发——微信小程序下拉刷新真机无法弹回

    开发工具中下拉之后页面回弹有一定的延迟,这个时间也有点久.真机测试,下拉后连回弹都没有,这个问题要解决,就得在下拉函数里加上停止下拉刷新的API,如下: /** * 下拉刷新 */ onPullDow ...

  8. 解决VS Code开发Python3语言自动补全功能

    1.打开设置界面 2)使用快捷键组合[Ctrl+Shift+p] . 输入setting,选中首选项的user setting模式设置界面 在打开的User Settings文件界面,搜索:pytho ...

  9. Spring cloud微服务安全实战-7-1章节概述

    前面的章节都是围绕这微服务的安全在讲一些东西,包括微服务本身api的安全.网关的安全.怎么去做安全中心,包括认证服务器,权限的服务.权限的设计,怎么来实现SSO.然后sentinel来实现统一的熔断, ...

  10. 上传base64图片并压缩

    elementUI+react 布局 <Dialog title="充值" visible={ dialogVisible } onCancel={ () => thi ...