前言
一刷不行,不出几天就忘记了,温故而知新,下面我们完成下面这些题目吧。本文给出了思路和代码
题目
1.Leetcode121 买卖股票的最佳时机
思路:理解题意后,首先看值的范围,1 <= prices.length <= 10^5,暴力算法首先排除,暴力解决2500以内的数据,对于此题可以先做到局部最优,每次存储最小的值,每次记录最大的利润,从而达到全局最优.通过一个辅助元素low来记录小值,通过result变量来统计最大的利润。
举例:7 5 9 1
首先从头开始,最小值时7 ,利润为0;然后最小值为5,利润为0;随着遍历到9,最小值还是5,利润为4;最小值为1,利润为0;从而得到最大利润4
class Solution{ public int maxProfit(int[] prices){ int low = Integer.MAX_VALUE; int result = 0; for(int i = 0;i<prices.length;i++){ low = prices[i]<low?prices[i]:low; result = (prices[i]-low)>result?(prices[i]-low):result; } return result; } }
2.Leetcode20 有效的括号
本文我之前做过详细讲解:文章直达:有效括号
3.Leetcode53 最大子数组和
本文我之前做过详细讲解:文章直达:最大子数组和
4.Leetcode15 三数之和
思路: 快排+双指针
通过什么能同时记录三个值,此时我们可以通过一层for循环来确定第一个值,使用left和right指针来确定第二第三个值。
首先观察题目值得取值范围:3 <= nums.length <= 3000,如果我们使用暴力双循环的话只能处理2500,所以暴力算法不能通过
我们首先可以使用Arrays.sort() 对数组进行先排序,
**难点:**需要明白的是:去重。举个例子:-1 -1 2 3 3 最终找到的结果是 -1 -1 2; 我们此时如果索引指到第一个-1时能得到这样的值;当索引指到第二个-1的值还能得到这样的值,所以如果索引前后有相同的值,需要完成去重。所以重点是要理解对这三个值的去重操作
class Solution { public List<List<Integer>> threeSum(int[] nums) { // 快排+双指针+去重 List<List<Integer>> list = new ArrayList<>(); // 首先对数组进行排序 Arrays.sort(nums); for(int i =0;i<nums.length;i++){ // 通过排序 如果第一个都大于0的话,那后面都会大于0,那么不符合条件 if(nums[i]>0){ return list; } // 这里是对第一个值的取值进行去重操作 if(i>0 && nums[i] == nums[i-1]){ continue; } // 定义第二 第三个指针 int left = i+1; int right = nums.length-1; // 通过for循环确定第一个值,while循环移动第二第三个值 while(left<right){ // 求和 和 0 判断 if(nums[i]+nums[left]+nums[right] < 0){ left++; }else if(nums[i]+nums[left]+nums[right] > 0){ right--; }else{ // 将数组转化成列表作为这个列表的括号内的值 list.add(Arrays.asList(nums[i],nums[left],nums[right])); // 如果相同的话 需要对左右指针进行去重操作 // 进行去重操作, 对right指针进行去重 while(left<right && nums[right] == nums[right-1]){ right--; } // 进行去重操作,对left指针进行去重 while(left<right && nums[left] == nums[left+1]){ left++; } // 找到符合的值后,同时移动左右指针 right--; left++; } } } return list; } }
5.Leetcode49 字母异位词分组
本文我之前做过详细讲解:文章直达:字母异位词分组
希望对您有所帮助,您的鼓励和支持是我最大的前进动力