🚀 算法题Day1 🚀
🌲 今天是力扣算法题持续打卡第1天🎈!
🌲 每天打卡两道算法题,既是一个学习过程,也是一个分享的过程。
🌲 提示:本专栏解题 编程语言一律使用 C++ / Java 进行解题
🌲 要保持一个每天都在学习的状态,让我们每天进步一点点🧐!
217. 存在重复元素 - 力扣(LeetCode)
给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;
如果数组中每个元素互不相同,返回 false 。
示例 1:
输入:nums = [1,2,3,1]输出:true
示例 2:
输入:nums = [1,2,3,4]输出:false
示例 3:
输入:nums = [1,1,1,3,3,4,3,2,4,2]输出:true
提示:
1 <= nums.length <= 105
-109 <= nums[i] <= 109
法一 :set去重
class Solution {
public boolean containsDuplicate(int[] nums) {
Set hs = new HashSet();
for(int i = 0; i < nums.length; i ++){
hs.add(nums[i]);
}
return hs.size() < nums.length ? true : false;
}
}
法二:[哈希表]
对于数组中每个元素,我们将它插入到哈希表中。如果插入一个元素时发现该元素已经存在于哈希表中,则说明存在重复的元素。
class Solution {
public boolean containsDuplicate(int[] nums) {
Set<Integer> set = new HashSet<Integer>();
for (int x : nums) {
if (!set.add(x)) {
return true;
}
}
return false;
}
}
53. 最大子数组和 - 力扣(LeetCode)
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:输入:nums = [1]
输出:1
示例 3:输入:nums = [5,4,-1,7,8]
输出:23
提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104
法一:贪心算法
class Solution {
public int maxSubArray(int[] nums) {
int pre = 0, maxAns = nums[0];
for (int x : nums) {
pre = Math.max(pre + x, x); // 当前和 = max(之前和 + 当前数,当前数)
maxAns = Math.max(maxAns, pre); //最大和 = max(当前和,之前和)
}
return maxAns;
}
}
法二:动态规划
public class Solution {
public int maxSubArray(int[] nums) {
int len = nums.length;
// dp[i] 表示:以 nums[i] 结尾的连续子数组的最大和
int[] dp = new int[len];
dp[0] = nums[0];
for (int i = 1; i < len; i++) {
if (dp[i - 1] > 0) {
dp[i] = dp[i - 1] + nums[i];
} else {
dp[i] = nums[i];
}
}
// 也可以在上面遍历的同时求出 res 的最大值,这里我们为了语义清晰分开写,大家可以自行选择
int res = dp[0];
for (int i = 1; i < len; i++) {
res = Math.max(res, dp[i]);
}
return res;
}
}
进阶:如果已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。