T1: 差值数组不同的字符串

思路:数组遍历

  • 若前两个字符串差值数组不同,则只需要继续计算第三个字符串的差值数组即可得到答案
  • 若前两个字符串差值数组相同,则依次遍历后续字符串,直至找到不同的差值数组
public String oddString(String[] words) {
int length = words[0].length();
int[] difference1 = new int[length - 1];
int[] difference2 = new int[length - 1];
char[] chArr1 = words[0].toCharArray();
char[] chArr2 = words[1].toCharArray(); for (int i = 0; i < length - 1; i++) {
difference1[i] = chArr1[i + 1] - chArr1[i];
difference2[i] = chArr2[i + 1] - chArr2[i];
} // 前两个字符串的差值数组相同
if (isSame(difference1, difference2)) {
for (int i = 2; i < words.length; i++) {
char[] chArr = words[i].toCharArray();
for (int j = 0; j < length - 1; j++) {
difference2[j] = chArr[j + 1] - chArr[j];
} if (!isSame(difference1, difference2)) {
return words[i];
}
}
} // 前两个字符串的差值数组不同
else {
char[] chArr = words[2].toCharArray();
int[] difference3 = new int[length - 1];
for (int i = 0; i < length - 1; i++) {
difference3[i] = chArr[i + 1] - chArr[i];
} if (isSame(difference1, difference3)) {
return words[1];
}
else {
return words[0];
}
} return null;
} /**
* 辅助函数, 判断两个差值数组是否相同
* @param arr1
* @param arr2
* @return
*/
public boolean isSame(int[] arr1, int[] arr2) {
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]) {
return false;
}
} return true;
}

T2: 距离字典两次编辑以内的单词

思路:数组遍历

public List<String> twoEditWords(String[] queries, String[] dictionary) {
List<String> res = new ArrayList<>();
for (String query : queries) {
if (isSatisfy(query, dictionary)) {
res.add(query);
}
} return res;
} /**
* 辅助函数, 判断单词是否满足两次以内
* @param s
* @param dictionary
* @return
*/
public boolean isSatisfy(String s, String[] dictionary) {
for (String dict : dictionary) {
int count = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) != dict.charAt(i)) {
count += 1;
} if (count > 2) {
break;
}
} if (count <= 2) {
return true;
}
} return false;
}

T3: 摧毁一系列目标

思路:数组遍历 + 哈希

这道题的核心是找到数组元素对 space 取模后结果相等的最大个数,然后返回对应的元素最小值。

public int destroyTargets(int[] nums, int space) {
/**
* key: num 对 space 取模后的值
* int[0]: 表示对 space 取模后值为 key 的数量
* int[1]: 表示对 space 取模后值为 key 的最小 num
*/
Map<Integer, int[]> map = new HashMap<>(); for (int num : nums) {
int temp = num % space;
if (!map.containsKey(temp)) {
map.put(temp, new int[]{1, num});
}
else {
int[] arr = map.get(temp);
arr[0] += 1;
arr[1] = Math.min(arr[1], num);
map.put(temp, arr);
}
} int maxCount = Integer.MIN_VALUE;
int res= 0;
for (Map.Entry<Integer, int[]> entry : map.entrySet()) {
int[] arr = entry.getValue();
if (maxCount < arr[0]) {
res = arr[1];
maxCount = arr[0];
}
else if (maxCount == arr[0]) {
res = Math.min(res, arr[1]);
}
} return res;
}

T4: 下一个更大元素IV

思路:单调栈 + 小顶堆

  • 使用单调栈寻找元素右边第一个更大的元素
  • 若找到右边第一个更大的元素,则将该值从栈内弹出,加入小顶堆
  • 若当前元素大于堆顶的值,则说明当前元素为堆顶元素的第二个更大的元素
public int[] secondGreaterElement(int[] nums) {
int n = nums.length; int[] ans = new int[n];
Arrays.fill(ans, -1); Stack<Integer> stack = new Stack<>();
Queue<Integer> queue = new PriorityQueue<>((o1, o2) -> {
return nums[o1] - nums[o2];
}); for (int i = 0; i < n; ++i) {
while (!queue.isEmpty() && nums[queue.peek()] < nums[i]) {
ans[queue.peek()] = nums[i];
queue.poll();
} while (!stack.isEmpty() && nums[stack.peek()] < nums[i]) {
queue.offer(stack.pop());
} stack.push(i);
} return ans;
}

总结

  1. 第三题耗时较长,一开始没有用哈希来存,直接开辟了 space 长度的二维数组,导致内存不足,需要对数据大小更敏感一些。
  2. 第四题限定时间内没有完成,能想到是用单调栈来找第一个更大的元素,但如何去找到第二个更大的元素未能完成。

LeeCode 90双周赛复盘的更多相关文章

  1. leetcode 双周赛9 进击的骑士

    一个坐标可以从 -infinity 延伸到 +infinity 的 无限大的 棋盘上,你的 骑士 驻扎在坐标为 [0, 0] 的方格里. 骑士的走法和中国象棋中的马相似,走 “日” 字:即先向左(或右 ...

  2. leetcode 双周赛9 找出所有行中最小公共元素

    给你一个矩阵 mat,其中每一行的元素都已经按 递增 顺序排好了.请你帮忙找出在所有这些行中 最小的公共元素. 如果矩阵中没有这样的公共元素,就请返回 -1. 示例: 输入:mat = [[,,,,] ...

  3. LeetCode第8场双周赛(Java)

    这次我只做对一题. 原因是题目返回值类型有误,写的是 String[] ,实际上应该返回 List<String> . 好吧,只能自认倒霉.就当涨涨经验. 5068. 前后拼接 解题思路 ...

  4. LeetCode 第 15 场双周赛

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

  5. LeetCode 第 14 场双周赛

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

  6. leetcode-15双周赛-1286-字母组合迭代器

    题目描述: 方法: class CombinationIterator: def __init__(self, characters: str, combinationLength: int): se ...

  7. leetcode-15双周赛-1287-有序数组中出现次数超过25%的元素

    题目描述: 方法一:二分法 class Solution: def findSpecialInteger(self, arr: List[int]) -> int: span = len(arr ...

  8. leetcode-15双周赛-1288-删除被覆盖区间

    题目描述: 方法一:排序O(Nlogn) class Solution: def removeCoveredIntervals(self, intervals: List[List[int]]) -& ...

  9. leetcode-15双周赛-1289-下降路径最小和

    题目描述: 方法一:动态规划 O(N^3) class Solution: def minFallingPathSum(self, arr: List[List[int]]) -> int: n ...

  10. leetcode-第14周双周赛-1274-矩形内船只的数目

    题目描述: 自己的提交: # """ # This is Sea's API interface. # You should not implement it, or s ...

随机推荐

  1. arduino问题记录

    1.tx.rx只能写,不能读 2.Arduino中文社区

  2. 12.8 linux学习第十五天

    今天老刘讲了第11章和第12章,感觉讲的速度很快,一气呵成,水都没怎么喝. 11.1 文件传输协议 一般来讲,人们将计算机联网的首要目的就是获取资料,而文件传输是一种非常重要的获取资料的方式.今天的互 ...

  3. windows 获取USB,发现安卓设备,转载自www.jb51.net/article/164456.htm

    转载 作者:jgw2008 import win32com.client def CheckDev(): wmi = win32com.client.GetObject ("winmgmts ...

  4. 北京金橙子ezcad2和lmc1控制卡二次开发的动态连接库手册

    我要吐槽一下金橙子打电话过去一问三不答.要个手册2.0的不给,只给3.0的.而且态度角度***钻,想尽一切办法让你自己用不了.我又不是要做打标卡,只是做个二次开发.有必要这样吗?反正我是不会推荐用户再 ...

  5. MFC的对话框使用Scintilla

    工作中需要做一个脚本编辑器的工具,用于代码补全.语法高亮.错误提示等功能,可以直接使用开源控件Scintilla, 网上有一些MFC的多文档使用Scintilla的例子,项目中使用的是对话框,自己实现 ...

  6. ORACLE触发器:插入数据时,对其中的一个字段进行默认赋值

    Create trigger t_datebefore insertbegin:new.sj = to_char(sysdate,'yyyy-MM-dd HH:mm:ss')end

  7. 【前端工程化】使用Nexus 搭建前端 npm 私服

    参考文献1 - https://blog.51cto.com/lookingdream/3609619 参考文献2 - https://blog.csdn.net/u013278374/article ...

  8. SpringSecurity登录验证,多个用户表

    在开始之前我想感叹一句,技术久了不回头看看真的会忘记的,这次公司让我重新开发一个程序,项目架构为单体多模块开发,其中有个需求就是需要不同用户表进行登录,且不同表的用户名.手机号都可以重复. 这样的需求 ...

  9. mysql80解决不支持中文的问题

    1.查看mysql80字符集 show variables like 'character_set%'; 2.修改server编码格式 在mysql安装目录下找到my-default.ini文件并复制 ...

  10. PHP精度计算函数

    bcadd - 将两个高精度数字相加 bccomp - 比较两个高精度数字,返回-1, 0, 1 bcdiv - 将两个高精度数字相除 bcmod - 求高精度数字余数 bcmul - 将两个高精度数 ...