前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode-316. 去除重复字母&&1081.不同字符的最小子序列(java)

LeetCode-316. 去除重复字母&&1081.不同字符的最小子序列(java)

作者头像
bug菌
发布2023-05-27 15:32:00
2260
发布2023-05-27 15:32:00
举报
文章被收录于专栏:《项目实战教学》

一、前言:

👨‍🎓作者:bug菌 ✏️博客:CSDN​、掘金等 💌公众号:​​猿圈奇妙屋​​ 🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。 🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。

二、题目描述:

给你一个字符串 ​​s​​ ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。

示例 1:

代码语言:javascript
复制
s = "bcabc"
"abc"

注意:该题与 ​​1081. 不同字符的最小子序列​​ 相同

三、思路分析:

统计字符出现次数,遍历字符串,当前字符出现次数-1;当前字符不在栈中(目的:去重,如abcabc的第二个a);栈顶字符 > 当前字符(目的:字典序最小。贪心策略:字符越小越前);栈顶字符后面还有出现(目的:字符至少出现一次。没有出现不能删);弹出,即删。重复上面的判断,直到条件不成立;即:数组越界 或 栈顶字符 < 当前字符 或 >,但后面没有该字符;

四、算法实现:

 方法一:

代码语言:javascript
复制
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;
     }

方法二:

代码语言:javascript
复制
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-316. 去除重复字母&&1081.不同字符的最小子序列(java)_i++
LeetCode-316. 去除重复字母&&1081.不同字符的最小子序列(java)_i++

思路二之哈希表法leetcode提交运行结果截图如下:

LeetCode-316. 去除重复字母&&1081.不同字符的最小子序列(java)_i++_02
LeetCode-316. 去除重复字母&&1081.不同字符的最小子序列(java)_i++_02

        综上所述,运行结果对比下来很明显嘛,结合map进行查找,效率明显更高,提高了查询​​target - num​​效率。如果是你们,你们也会采用思路二吧。

        再者,解题道路千万条,小伙伴们,你们如果有啥更好的想法或者思路,欢迎评论区告诉我哦,大家一起互相借鉴互相学习,方能成长的更快。

        好啦,以上就是本期的所有内容啦,咱们下期见咯。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言:
  • 二、题目描述:
  • 三、思路分析:
  • 四、算法实现:
  • 五、总结:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档