刷leetCode算法题+解析(十九)

闲来无事多刷几道题。

存在重复元素

给定一个整数数组,判断是否存在重复元素。如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。

示例 1:
输入: [1,2,3,1]
输出: true
示例 2:
输入: [1,2,3,4]
输出: false
示例 3:
输入: [1,1,1,3,3,4,3,2,4,2]
输出: true

思路:这个题暴力法就能解决,随随便便好几种方法。绝对不打脸的,排序然后比较,但是我觉得用这种方法肯定会有人说既然算法题别用现成的api。还可以用map。key是数值,value随意。遍历数组,有存在的key说明重了,返回true。圈遍历下来没true说明没重复的,返回false。我去撸代码了。

class Solution {
    public boolean containsDuplicate(int[] nums) {
        Map<Integer,Integer> map = new HashMap<Integer,Integer>();
        for(int i=0;i<nums.length;i++){
            if(map.containsKey(nums[i])){
                return true;
            }else{
                map.put(nums[i],1);
            }
        }
        return false;
    }
}

额,这种是最简单的方式,其实这个和上片文中的一道题同构字符串差不多原理(有兴趣的可以看看同构字符串)其实应该也可以用位置来判断,我去试试。
试完回来了,理论上讲这个方法是可以的。不过在这里提交超出时间限制的(真的佩服leetcode测试案例)。所以我还是想想别的办法吧。
看了官方题解,居然是建议排序???那这个方法有什么意义了?理解不了。感觉有点欺骗感情啊。算了,下一题吧。

存在重复元素二

题目:给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。

示例 1:
输入: nums = [1,2,3,1], k = 3
输出: true
示例 2:
输入: nums = [1,0,1,1], k = 1
输出: true
示例 3:
输入: nums = [1,2,3,1,2,3], k = 2
输出: false

思路:这种系列题很不错啊,大多数一个通个个通。其实这个题跟上题差不多,判断是不是重复元素,区别只不过多加了一步还要判断和上个重复元素的位置差。满足要求返回true,遍历完没满足的返回false。直接上代码:

class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        Map<Integer,Integer> map = new HashMap<Integer,Integer>();
        for(int i = 0;i<nums.length;i++){
            if(map.containsKey(nums[i])){
                if(i-map.get(nums[i])>k){
                    //其实求的是相同元素最小差值,所以再之前的不用管,直接替换掉
                    map.put(nums[i],i);
                }else{
                    return true;
                }
            }else{
                map.put(nums[i],i);
            }
        }
        return false;
    }
}

因为这个性能已经很不错了,所以我直接下一题了。

用队列实现栈

题目:使用队列实现栈的下列操作:

push(x) -- 元素 x 入栈
pop() -- 移除栈顶元素
top() -- 获取栈顶元素
empty() -- 返回栈是否为空
注意:
你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。

思路:这个题怎么说呢,我做过类似的,只不过当时那个题要求是实现这些方法外还有个getMin()获取栈中的最小值。而且并没有要求一定要用队列做。具体哪道题我有点忘了,不过这都不重要。咱们继续说这道题:其实非常简单,要求也很明确,就是简单的实现四个方法而已。一步步分析:首先这个push进去的是一个int(模板上有),所以这个队列Queue是int类型的,其次在java中队列实现类如下图,我个人决定用熟悉一点的LinkedList来实现。剩下没啥好说的,说实话,我完全没懂这个题考的啥?对java队列方法的理解??算了,我先去撸代码。

Queue实现类

代码实现,简单粗暴到没朋友,一直怀疑我是不是审错题了。完全不懂直接调用api是干啥的。但是非要队列实现,我也不能自己写,奇了怪了就是。

class MyStack {

    private LinkedList queue;

    /** Initialize your data structure here. */
    public MyStack() {
        queue = new LinkedList<Integer>();
    }
    
    /** Push element x onto stack. */
    public void push(int x) {
        queue.addFirst(x);
    }
    
    /** Removes the element on top of the stack and returns that element. */
    public int pop() {
        return (int)queue.poll(); 
    }
    
    /** Get the top element. */
    public int top() {
        return (int)queue.peek();
    }
    
    /** Returns whether the stack is empty. */
    public boolean empty() {
        if(queue.peek()==null){
            return true;
        }       
        return false;
    }
}

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack obj = new MyStack();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.top();
 * boolean param_4 = obj.empty();
 */

看了评论才看明白坑点在哪里:这个题目上说了只能使用队列的基本操作。就是往后插入,从前面获取,是否为空等。我上问用到的addFirst不能用。这一块要自己实现。其实主要就是队列的特性就是先入后出。正好相反栈的特点就是先入先出,所以
这道题的考点也就是这。用队列来实现先入先出。改进的话只要把上文的push方法改一下就行了,其实方法应该不少,我选了一个最简单的,就是整个取出来重新装一下,虽然想想性能就不能太好(数据多了肯定麻烦的要死),但是因为现在心态有点炸所以就先这样吧。直接贴代码:

class MyStack {

    private Queue queue;

    /** Initialize your data structure here. */
    public MyStack() {
        queue = new LinkedList<Integer>();
    }
    
    /** Push element x onto stack. */
    public void push(int x) {
        queue.add(x);
        int sz = queue.size();
        while (sz > 1) {
            queue.add(queue.poll());
            sz--;
        }
    }
    
    /** Removes the element on top of the stack and returns that element. */
    public int pop() {
        return (int)queue.poll(); 
    }
    
    /** Get the top element. */
    public int top() {
        return (int)queue.peek();
    }
    
    /** Returns whether the stack is empty. */
    public boolean empty() {
        if(queue.peek()==null){
            return true;
        }       
        return false;
    }
}

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack obj = new MyStack();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.top();
 * boolean param_4 = obj.empty();
 */

刷题就到这了,顺便说点别的。
我一直声明我喜欢it行业敲代码是种乐趣。毕竟1就是1,0就是0.对就是对,错就是错。干净又明了。结果现在做个题看评论给我看出脾气来了!刷算法题就应该自己造轮子?那些说这道题考什么考什么的,用了什么什么就丢人了的,题目上都没写,作者指不定都没想到,你是什么玩意儿?站在道德制高点优越个鸡儿呢?mmp哦,刷算法就nb怎么不说用编程语言没意义,直接去0,1机器码写呢?
今天刷题就刷到这,我去leetCode评论喷人去了,合理的发泄有利于身心健康。如果稍微帮到你了记得点个喜欢点个关注,另外也祝大家工作顺顺利利!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354