每日2道leetcode题------数组篇

165 阅读1分钟

题目一:给定一个整数数组,判断是否存在重复元素。

如果存在一值在数组中出现至少两次,函数返回 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

方法一暴力解法,啥都不考虑:

    class Solution { 
        public boolean containsDuplicate(int[] nums) { 
            Boolean flag = false; 
            for(int i =0 ; i< nums.length; i ++){ 
                for(int j = i+1; j <=nums.length-1; j++){ 
                    if(nums[i] == nums[j]){ flag =true; break; 
                        } 
                     } 
                 } return flag;
            }
       }

然后提交后,就超时咯,哇咔咔咔 截图如下:

image.png

方法二哈希表:

    class Solution { 
        public boolean containsDuplicate(int[] nums) { 
            HashSet<Integer> hashSet = new HashSet<>(); 
            for (int i =0; i < nums.length; i++){ 
                if(!hashSet.add(nums[i])){ 
                    return true; 
                    } 
                } 
                return false; 
            } 
        }

执行结果如下下:

image.png

复杂度分析

  • 时间复杂度:O(N)O(N),其中 NN 为数组的长度。
  • 空间复杂度:O(N)O(N),其中 NN 为数组的长度。

题目二:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。 示例 2:

输入:nums = [1] 输出:1 示例 3:

输入:nums = [0] 输出:0 示例 4:

输入:nums = [-1] 输出:-1 示例 5:

输入:nums = [-100000] 输出:-100000     以前解除过类似动态规划的算法题,所以第一想法就是这个:

   class Solution {
    public int maxSubArray(int[] nums) {
        int sum = 0;
        int max = nums[0];
        for(int num:nums){
            if(sum > 0){
                sum += num;
            }else{
                sum = num;
            }
            max = Math.max(max,sum);
        }
        return max;
    }
}

image.png

题目来源:leetcode数据结构