👨🎓作者:bug菌 ✏️博客:CSDN、掘金等 💌公众号:猿圈奇妙屋 🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。 🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。
给你一个字符串 s
,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
示例 1:
s = "bcabc"
"abc"
注意:该题与 1081. 不同字符的最小子序列 相同
统计字符出现次数,遍历字符串,当前字符出现次数-1;当前字符不在栈中(目的:去重,如abcabc的第二个a);栈顶字符 > 当前字符(目的:字典序最小。贪心策略:字符越小越前);栈顶字符后面还有出现(目的:字符至少出现一次。没有出现不能删);弹出,即删。重复上面的判断,直到条件不成立;即:数组越界 或 栈顶字符 < 当前字符 或 >,但后面没有该字符;
方法一:
public List<Integer> findDisappearedNumbers(int[] nums) {
ArrayList<Integer> list = new ArrayList<Integer>();
Map<Integer, Integer> map = new HashMap<Integer,Integer>(16);
//只需记录不同的num 存key即可
for(Integer num :nums){
map.put(num,1);
}
for (int i = 1; i <= nums.length; i++) {
//判断key不存在即写入
if(!map.containsKey(i)){
list.add(i);
}
}
return list;
}
方法二:
public static List<Integer> findDisappearedNumbers(int[] nums) {
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < nums.length; i++) {
int newIndex = Math.abs(nums[i]) - 1;//防止下标为负
//防止下标越界
if(newIndex >=nums.length){
continue;
}
if (nums[newIndex] > 0) {
nums[newIndex] *= -1;
}
}
for (int i = 1; i <= nums.length; i++) {
if (nums[i - 1] > 0) {
list.add(i);
}
}
return list;
}
思路一之暴力枚举法leetcode提交运行结果截图如下:
思路二之哈希表法leetcode提交运行结果截图如下:
综上所述,运行结果对比下来很明显嘛,结合map进行查找,效率明显更高,提高了查询target - num
效率。如果是你们,你们也会采用思路二吧。
再者,解题道路千万条,小伙伴们,你们如果有啥更好的想法或者思路,欢迎评论区告诉我哦,大家一起互相借鉴互相学习,方能成长的更快。
好啦,以上就是本期的所有内容啦,咱们下期见咯。