前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >哈希表-LeetCode 217、219、220、232(hashset、hashmap)

哈希表-LeetCode 217、219、220、232(hashset、hashmap)

作者头像
算法工程师之路
发布2019-11-15 20:55:57
4820
发布2019-11-15 20:55:57
举报

作者:TeddyZhang

哈希表:LeetCode #217 219 220 232

编程题

【LeetCode #217】存在重复元素

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

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

解题思路:

第一种使用hash_set去重,第二种排序后检查相邻元素是否相等。

(哈希表)

代码语言:javascript
复制
class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        unordered_set<int> set;
        for(auto num: nums){
            if(set.count(num)){
                return true;
            }else{
                set.insert(num);
            }
        }
        return false;
    }
};

(排序法)

代码语言:javascript
复制
class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        if(nums.size() < 1) return false;
        sort(nums.begin(), nums.end(), [](const int &a, const int &b){
            return a < b;
        }); 
        for(int i = 0; i < nums.size()-1; i++){
            if(nums[i] == nums[i+1]) 
                return true;
        }
        return false;
    }
};

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/contains-duplicate

【LeetCode #219】存在重复元素II

给定一个整数数组和一个整数 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

解题思路

使用哈希表,将每个数字的索引号存入哈希表,nums[i]为key, i为vlaue, 遍历数组,并查询哈希表,如果存在,即两数相同,则判断索引之间差值是否小于等于K, 如果是返回true,否则更新nums[i]所对应的索引,用于下一次的比较!

代码语言:javascript
复制
class Solution {
public:
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
        unordered_map<int, int> hashmap;
        for(int i = 0; i < nums.size(); i++){
            if(hashmap.count(nums[i])){
                if(i - hashmap[nums[i]] <= k){     //判断相同的值得索引差值
                    return true;
                }else{
                    hashmap[nums[i]] = i;  //更新nums[i]的索引
                }
            }else{
                hashmap.emplace(nums[i], i);
            }
        }
        return false;
    }
};

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/contains-duplicate-ii

【LeetCode #220】存在重复元素III

给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ。

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

解题思路:

首先使用一个set作为一个滑动窗口,这样可以保证每个数的索引i和j之间差值小于等于k,然后另外一个条件是nums[i]和nums[j]的差的绝对值小于等于t,即 -t <= nums[i]-nums[j] <= t , 再进一步: nums[i] - t <= nums[j] <= nums[i] + t,也就是说在set中找到满足这个式子的i, j就可以返回true了! 在STL库中,low_bound(type t)表示返回一个大于等于t的值,如果找不到就返回end() 因此在程序中,首先找到low_bound(nums[i]-t),然后判断其是不是小于等于nums[i]+t,如果满足,则返回true,否则就继续移动长为k的滑动窗口寻找!

代码语言:javascript
复制
class Solution {
public:
    bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
        if(k < 1 || t < 0){
            return false;
        }
        int size = nums.size();
        if(size == 1)  return false;

        set<long long> s;
        int low = 0;
        for(int i = 0; i < size; i++){
            auto it = s.lower_bound((long long)nums[i]-t);
            if(it != s.end() && *it <= (long long)nums[i]+t){
                return true;
            }
            s.insert(nums[i]);     // 使得滑动窗口的大小不变
            if(s.size() == k+1){      
                s.erase(nums[low++]);
            }
        }
        return false;
    }
};

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/contains-duplicate-iii

【LeetCode #232】用栈实现队列

使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部。 pop() -- 从队列首部移除元素。 peek() -- 返回队列首部的元素。 empty() -- 返回队列是否为空。

示例: MyQueue queue = new MyQueue(); queue.push(1); queue.push(2); queue.peek(); // 返回 1 queue.pop(); // 返回 1 queue.empty(); // 返回 false

解题思路:

用栈实现队列,十分简单,使用两个栈,一个为data栈,用于数据入队列,而另一个为tmp栈,用于数据出队列!

代码语言:javascript
复制
class MyQueue {
public:
    /** Initialize your data structure here. */
    stack<int> data;
    stack<int> tmp; 
    MyQueue() {}

    /** Push element x to the back of queue. */
    void push(int x) {
        data.push(x);
    }

    /** Removes the element from in front of queue and returns that element. */
    int pop() {
        if(tmp.empty()){
            int size = data.size();
            while(size--){
                tmp.push(data.top());
                data.pop();
            }
        }
        int t = tmp.top();
        tmp.pop();
        return t;
    }

    /** Get the front element. */
    int peek() {
          if(tmp.empty()){
            int size = data.size();
            while(size--){
                tmp.push(data.top());
                data.pop();
            }
        }
        return tmp.top();      
    }

    /** Returns whether the queue is empty. */
    bool empty() {
        return data.empty() && tmp.empty();
    }
};

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue* obj = new MyQueue();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->peek();
 * bool param_4 = obj->empty();
 */

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/implement-queue-using-stacks

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法工程师之路 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档