Leetcode第一周练习总结(1.1~1.7)

文章目录

系列:周练
语言:java
题目:leetcode121 leetcode20 leetcode15 leetcode53 leetcode49
考点:暴力法 && 贪心算法 && 栈方法 && 哈希表 &&双指针


思路和参考答案

  • 文章目录
    • 前言
  • 题目
  • 1.Leetcode121 买卖股票的最佳时机
  • 2.Leetcode20 有效的括号
  • 3.Leetcode53 最大子数组和
  • 4.Leetcode15 三数之和
  • 5.Leetcode49 字母异位词分组


前言

一刷不行,不出几天就忘记了,温故而知新,下面我们完成下面这些题目吧。本文给出了思路和代码

题目

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 字母异位词分组

题目链接
本文我之前做过详细讲解:文章直达:字母异位词分组
希望对您有所帮助,您的鼓励和支持是我最大的前进动力!

你可能感兴趣的:(算法提炼,leetcode,贪心算法,算法,数据结构,java)