LeetCode刷题笔记—简单题(Java版)(二)

169、求众数

解法一:因为题目中说一定存在众数,且众数是出现次数超过长度的一半。所以本题可以先进行排序后,去数组最中间的那个数,因为众数超过一半,排序过后最中间的数肯定是众数。

class Solution {
    public int majorityElement(int[] nums) {
        
        int n = nums.length;
        Arrays.sort(nums);
        return nums[nums.length/2];
    }
}

解法二:hashmap的使用,遍历nums,判断nums[i]是否在hashmap中,存在则对应的value+1,不存在就重新put进去,并且设置value为1.最终遍历hashmap,找出value最大的对应的key即为所求众数。

class Solution {
    public int majorityElement(int[] nums) {
        HashMap hashMap = new HashMap<>();
        for(int i = 0;i nums.length/2 )
                return key;
        }
        return 0;
    }
}

解法三:分治法

189,求旋转数组

解法一:递归旋转,将整个数组旋转,在将后k个元素和0到k-1个元素旋转

class Solution {
    public void rotate(int[] nums, int k) {
        int n=nums.length;
        k = k%n;
         reverse(nums,0,n-1);
        reverse(nums,0,k-1);
        reverse(nums,k,n-1);
       
    }
    
     public void reverse(int[] nums,int start,int end){
        while (start

 

198,打家劫舍

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

class Solution {
    public int rob(int[] nums) {
        //空数组或一个数组情况
        if(nums.length == 0){
            return 0;
        }else if(nums.length == 1){
            return nums[0];
        }
        //定义一个list存放前边做多抢劫的数目,其实用简单的int[]就行了。
        ArrayList list=new ArrayList(nums.length);
        list.add(0,nums[0]);
        int q = Math.max(nums[1],nums[0]);
        list.add(1,q);
        //当数组大于2个数时,当前的房子可选择打劫或者不打劫。
        //1 打劫的话就是当前房子的金额加上i-2时能打劫到的最大金额(已经存放list中)
        //2 不打劫的话,就是打劫上一个房间的最大金额,
        //然后比较这俩哪个最大,最大的就是当前最大的打劫金额
        for(int i = 2;i

 

202、快乐数

一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。 

解法一:思路,用set记录每次对一个数进行平方操作后的数,记录一次判断一次这个数是否出现过,或者是否为1,如果出现过说明不是快乐数,如果为1则说明是快乐数。#重点是,不是快乐数会一直循环,这是用set判断之前出现过可以跳出循环。

class Solution {
    public boolean isHappy(int n) {
        //定义一个set存放中间出现的数
        HashSet hashSet = new HashSet();
        //在set中不存在n,且n不是1的时候循环,因为是1的话说明快乐数,如果非非快乐数会一直循环,
        // 用set存放就是为了找到之前出现过的数,说明不是快乐数
        while(n != 1 && !hashSet.contains(n)){
            hashSet.add(n);
            int sum = 0;
            //将一个数如23 编程 => 2*2 + 3*3 在返回给n看是否为1或者是否在set中
            while (n != 0){
                sum += Math.pow(n%10,2.0);
                n /= 10;
            }
            n = sum;
        }
        return n == 1;
    }
}

 

你可能感兴趣的:(Algorithm)