LeetCode(三)HashMap169. Majority Element&350. Intersection of Two Arrays II

来源:互联网 发布:域名交易流程 编辑:程序博客网 时间:2024/06/05 03:59

169. Majority Element

题目要求如下

Given an array of size n, find the majority element. The majority
element is the element that appears more than ⌊ n/2 ⌋ times.

You may assume that the array is non-empty and the majority element
always exist in the array.

题目解法如下,使用HashMap

import java.util.*;public class Solution {    public int majorityElement(int[] nums) {        Map<Integer,Integer>m=new HashMap<>();        for(int i=0;i<nums.length;i++){          if(!m.containsKey(nums[i])){              m.put(nums[i],1);          }          else{           m.put(nums[i],m.get(nums[i])+1);          }           if(m.get(nums[i])>nums.length/2) return nums[i];        }        return 0;    }}

350. Intersection of Two Arrays II

题目要求如下

Given two arrays, write a function to compute their intersection.

Example: Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2, 2].

Note: Each element in the result should appear as many times as it
shows in both arrays. The result can be in any order.

Follow up:
What if the given array is already sorted? How would you optimize your algorithm?
What if nums1’s size is small compared to nums2’s size?
Which algorithm is better? What if elements of nums2 are stored on
disk, and the memory is limited such that you cannot load all elements into the memory at once?

题目解法如下

public class Solution {    public int[] intersect(int[] nums1, int[] nums2) {        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();        ArrayList<Integer> result = new ArrayList<Integer>();        for(int i = 0; i < nums1.length; i++)        {            if(map.containsKey(nums1[i])) map.put(nums1[i], map.get(nums1[i])+1);            else map.put(nums1[i], 1);        }        for(int i = 0; i < nums2.length; i++)        {            if(map.containsKey(nums2[i]) && map.get(nums2[i]) > 0)            {                result.add(nums2[i]);                map.put(nums2[i], map.get(nums2[i])-1);            }        }       int[] r = new int[result.size()];       for(int i = 0; i < result.size(); i++)       {           r[i] = result.get(i);       }       return r;    }    }

两题都使用HashMap进行求解,HashMap可以很高效地进行存取键值对

HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。

当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。
参考:原文链接: Javarevisited
翻译:Importnew-唐小娟
译文链接: http://www.importnew.com/7099.html

阅读全文
0 0