存在重复元素

给定一个整数数组,判断是否存在重复元素。
如果存在一值在数组中出现至少两次,函数返回 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

排序
在对数字从小到大排序之后,数组的重复元素一定出现在相邻位置中。因此,我们可以扫描已排序的数组,每次判断相邻的两个元素是否相等,如果相等则说明存在重复的元素。

  1. class Solution {
  2. public boolean containsDuplicate(int[] nums) {
  3. Arrays.sort(nums);
  4. int n = nums.length;
  5. for (int i = 0; i < n - 1; i++) {
  6. if (nums[i] == nums[i + 1]) {
  7. return true;
  8. }
  9. }
  10. return false;
  11. }
  12. }

哈希表
对于数组中每个元素,我们将它插入到哈希表中。如果插入一个元素时发现该元素已经存在于哈希表中,则说明存在重复的元素。

  1. class Solution {
  2. public boolean containsDuplicate(int[] nums) {
  3. Set<Integer> set = new HashSet<Integer>();
  4. for (int x : nums) {
  5. if (!set.add(x)) {
  6. return true;
  7. }
  8. }
  9. return false;
  10. }
  11. }

PS:做这道题的时候看到的是查找重复的元素,就直接想到了哈希表,没有想到还有排序的这种解法

最大的子序和

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

动态规划:
下面的解法是用动态规划的思想来做的,以后也会写一篇关于动态规划的专题,看了很多的讲解还是不能很好地理解,后来看到评论区中大神d而一句话:“之前数值所有的和加上自身,还没有我自己大,我要他干啥”看到这句话之后的我幡然醒悟。
pre是用来存储之前数值和加上自身的值,maxAns是用来维护最大子序和

  1. class Solution {
  2. public int maxSubArray(int[] nums) {
  3. int pre = 0, maxAns = nums[0];
  4. for (int x : nums) {
  5. pre = Math.max(pre + x, x);
  6. maxAns = Math.max(maxAns, pre);
  7. }
  8. return maxAns;
  9. }
  10. }