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

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

前言

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


题目

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

题目链接

本文我之前做过详细讲解:文章直达:字母异位词分组

希望对您有所帮助,您的鼓励和支持是我最大的前进动力

相关文章
|
6月前
|
算法
蓝桥杯算法竞赛第一周题型总结
蓝桥杯算法竞赛第一周题型总结
43 0
|
8月前
蓝桥杯(第一天)
蓝桥杯(第一天)
|
11月前
题目 2571: 蓝桥杯2020年第十一届省赛真题-回文日期
题目 2571: 蓝桥杯2020年第十一届省赛真题-回文日期
|
11月前
题目 2664: 蓝桥杯2022年第十三届省赛真题-求和
题目 2664: 蓝桥杯2022年第十三届省赛真题-求和
|
算法 程序员
力扣——算法入门计划第一天
力扣(LeetCode)是领扣网络旗下专注于程序员技术成长和企业技术人才服务的品牌。源自美国硅谷,力扣为全球程序员提供了专业的IT技术职业化提升平台,有效帮助程序员实现快速进步和长期成长。 此外,力扣(LeetCode)致力于解决程序员技术评估、培训、职业匹配的痛点,逐步引领互联网技术求职和招聘迈向专业化。
力扣——算法入门计划第一天
蓝桥31日冲刺 | 每日三题题解报告 第一天
大家好,我是泡泡,今天给大家带来今日打卡三道题的题解
134 0
|
存储
蓝桥杯真题31日冲刺 | 每日题解报告 第七天
大家好,我是泡泡,今天水一文,明天出两章
111 0
|
机器学习/深度学习
洛谷每日三题之第一天
洛谷每日三题之第一天
洛谷每日三题之第三天(第四天补做)
洛谷每日三题之第三天(第四天补做)
洛谷每日三题之第三天(第四天补做)