LeetCode第8场双周赛(Java)
这次我只做对一题。
原因是题目返回值类型有误,写的是 String[] ,实际上应该返回 List<String> 。
好吧,只能自认倒霉。就当涨涨经验。
5068. 前后拼接
解题思路
大致思路是用两层循环检查每两个短语是否能前后拼接成新短语。如果可以前后拼接,那么将它们拼接成新短语,并添加到结果列表。最后将列表升序返回。
由于需要第一个单词和最后一个单词,因此需要先进行分割处理,将得到的第一个单词和最后一个单词分别保存。由于可以确定大小,因此直接用二维数组保存即可。
// ht[i][0]表示第i个短语的第一个单词,ht[i][1]表示第i个短语的最后一个单词
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代码
class Solution {
	// 方法的返回值要改为List<String>,否则会报错
	public List<String> beforeAndAfterPuzzles(String[] phrases) {
		// 短语的第一个单词和最后一个单词
		String[][] ht = new String[phrases.length][2];
		// 分割短语,并获取第一个单词和最后一个单词
		for (int i = 0; i < phrases.length; ++i) {
			String[] phrase = phrases[i].split(" ");
			ht[i][0] = phrase[0];
			ht[i][1] = phrase[phrase.length - 1];
		}
		List<String> ans = new ArrayList<>();// 结果
		for (int i = 0; i < phrases.length; ++i) {
			for (int j = i + 1; j < phrases.length; ++j) {
				// 短语i的最后一个单词和短语j的第一个单词相同
				if (ht[i][1].equals(ht[j][0])) {
					String s = phrases[i];
					s += phrases[j].replaceFirst(ht[j][0], "");
					if (!ans.contains(s)) {// 确保新短语不重复
						ans.add(s);
					}
				}
				// 短语j的最后一个单词和短语i的第一个单词相同
				if (ht[j][1].equals(ht[i][0])) {
					String s = phrases[j];
					s += phrases[i].replaceFirst(ht[i][0], "");
					if (!ans.contains(s)) {
						ans.add(s);
					}
				}
			}
		}
		Collections.sort(ans);// 升序
		return ans;
	}
}
提交结果

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代码
class Solution {
    // 返回值改为List<Integer>,否则编译出错
    public List<Integer> shortestDistanceColor(	int[] colors,
                                                int[][] queries) {
        List<List<Integer>> color = new ArrayList<>();// 颜色1,2,3的列表
        for (int i = 0; i < 4; ++i) {
            color.add(new ArrayList<>());
        }
        for (int i = 0; i < colors.length; ++i) {
            color.get(colors[i]).add(i);// 将每种颜色的索引保存到对应的颜色列表
        }
        List<Integer> ans = new ArrayList<>();// 结果
        for (int[] querie : queries) {
            int i = querie[0];// 索引
            int c = querie[1];// 颜色
            List<Integer> col = color.get(c);// 颜色c的列表
            if (col.isEmpty()) {// 没有这种颜色
                ans.add(-1);// 不存在解决方案,添加-1
                continue;// 继续下一个查询
            }
            // 在颜色c的列表中查找值为i的索引
            int pos = Collections.binarySearch(col, i);
            if (pos >= 0) {// 找到
                ans.add(0);// 说明距离索引i最近的颜色c就是它自己(距离为0)
                continue;
            }
            // 未找到,pos表示第一个大于i的值的索引减1
            int posR = -pos - 1;// 第一个大于i的值的索引,范围是[0,col.size()]
            int posL = posR - 1;// 第一个小于i的值的索引
            if (posR == 0) {// 颜色c的所有索引都比i大,即索引i的左边没有颜色c
                ans.add(col.get(0) - i);// 最近的距离
                continue;
            }
            if (posR == col.size()) {// 颜色c的所有索引都比i小,即索引i的右边没有颜色c
                ans.add(i - col.get(posL));// 最近的距离
                continue;
            }
            // 索引i的左右都有颜色c,取最近的距离
            ans.add(Math.min(i - col.get(posL), col.get(posR) - i));
        }
        return ans;
    }
}
提交结果

1183. 矩阵中 1 的最大数量
解题思路
参考https://leetcode.com/savevmk的代码。
暂时还没弄懂为什么可以这样做。感觉这个方法太巧妙了。
Java代码
class Solution {
	public int maximumNumberOfOnes(	int width,
									int height,
									int sideLength,
									int maxOnes) {
		int[] arr = new int[sideLength * sideLength];// 子阵的一维形式
		for (int i = 0; i < height; ++i) {
			for (int j = 0; j < width; ++j) {
				int row = i % sideLength;
				int col = j % sideLength;
				++arr[row * sideLength + col];
			}
		}
		Arrays.sort(arr);// 升序
		int ans = 0;// 结果
		for (int i = 0; i < maxOnes; ++i) {
			ans += arr[arr.length - 1 - i];// 1的数量
		}
		return ans;
	}
}
提交结果

LeetCode第8场双周赛(Java)的更多相关文章
- Java实现 LeetCode第30场双周赛 (题号5177,5445,5446,5447)
		
这套题不算难,但是因为是昨天晚上太晚了,好久没有大晚上写过代码了,有点不适应,今天上午一看还是挺简单的 5177. 转变日期格式 给你一个字符串 date ,它的格式为 Day Month Yea ...
 - LeetCode 第 15 场双周赛
		
1287.有序数组中出现次数超过25%的元素 1288.删除被覆盖区间 1286.字母组合迭代器 1289.下降路径最小和 II 下降和不能只保留原数组中最小的两个,hacked. 1287.有序数组 ...
 - LeetCode 第 14 场双周赛
		
基础的 api 还是不够熟悉啊 5112. 十六进制魔术数字 class Solution { public: char *lltoa(long long num, char *str, int ra ...
 - LeetCode第29场双周赛题解
		
第一题 用一个新数组newSalary保存去掉最低和最高工资的工资列表,然后遍历newSalary,计算总和,除以元素个数,就得到了平均值. class Solution { public: doub ...
 - leetcode-第11场双周赛-5089-安排会议日程
		
题目描述: 自己的提交: class Solution: def minAvailableDuration(self, slots1: List[List[int]], slots2: List[Li ...
 - leetcode-第11场双周赛-5088-等差数列中缺失的数字
		
题目描述: 自己的提交: class Solution: def missingNumber(self, arr: List[int]) -> int: if len(arr) == 2: re ...
 - leetcode-第五场双周赛-1134-阿姆斯特朗数
		
第一次提交: class Solution: def isArmstrong(self, N: int) -> bool: n = N l = len(str(N)) res = 0 while ...
 - leetcode-第五场双周赛-1133-最大唯一数
		
第一次提交: class Solution: def largestUniqueNumber(self, A: List[int]) -> int: dict = {} for i in A: ...
 - LeetCode 第 165 场周赛
		
LeetCode 第 165 场周赛 5275. 找出井字棋的获胜者 5276. 不浪费原料的汉堡制作方案 5277. 统计全为 1 的正方形子矩阵 5278. 分割回文串 III C 暴力做的,只能 ...
 
随机推荐
- amundsen 来自lyft 的开源数据发现平台
			
amundsen 是来自lyft 开源的元数据管理.数据发现平台,功能点很全,有一个比较全的前端.后端以及 数据处理框架 参考架构图 说明 从官方介绍以及github代码仓库可以看出还是比较全的整体解 ...
 - globing通配符
			
匹配标点符号 linux中只要不含有/的文件就可以生成,所以标点符号也是符合要求的 匹配空白 使用\对空白进行转义,这样就可以生成包含空格名称的文件 但是不推荐这样用,容易让别人在使用的时候造成误解 ...
 - cyyz : Day 1 数论整理
			
声明:感谢修改这篇博客的dsr Day 1 先说一下上午的听课吧,哎~,简直了,简直(⊙o⊙)…咋说呢,引人入胜???No! 是昏昏欲睡好吧...一点听课欲都没有(强撑....),一上午停下来简直怀疑 ...
 - linux命令之------Chmod命令
			
Chmod命令 1)作用:linux和unix的文件调用权限分为三级:文件拥有者/群组/其他.利用chmod可以控制文件如何被他人所调用.(主要就是修改文件夹,文件的权限) 2)U表示该文件的拥有者, ...
 - shell脚本编程基础之for循环
			
循环结构 循环需要有进入条件和退出条件,如果没有退出条件,则就会一直循环下去 for 变量 in 列表:do 循环体 done 生成列表及示例 {1..100}:生成1到100的整数列表 `comma ...
 - OPPO-Java面试-社招-一面(2019/07)
			
个人情况 2017年毕业,普通本科,计算机科学与技术专业,毕业后在一个二三线小城市从事Java开发,2年Java开发经验.做过分布式开发,没有高并发的处理经验,平时做To G的项目居多.写下面经是希望 ...
 - vue+elementui搭建后台管理界面(6登录和菜单权限控制[二])
			
根据权限计算路由的代码 /** * 通过meta.role判断是否与当前用户权限匹配 * @param roles * @param route */ function hasRoles (roles ...
 - Linux Shell:根据指定的文件列表 或 map配置,进行文件位置转移
			
读取配置文件,进行文件位置转移 在whenb.csv中指定了需要从/home/root/cf/下移除到/home/root/cf_wh/下文件列表,whenb.csv中包含记录如下: enb- enb ...
 - Python 拼接字符串的几种方式
			
在学习Python(3x)的过程中,在拼接字符串的时候遇到了些问题,所以抽点时间整理一下Python 拼接字符串的几种方式. 方式1,使用加号(+)连接,使用加号连接各个变量或者元素必须是字符串类型( ...
 - Hbuilder提交项目到GitHub出现cannot open git-upload-pack
			
问题描述 Hbuilder上传本地项目到GitHub时是通过下载的Egit插件,然而提交代码时出现下图问题 网上有说添加http的sslVerify=false,然并卵. 解决方案 不用hbuilde ...