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

题目链接

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

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

相关文章
|
7月前
|
算法 C语言 容器
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣(上)
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣
49 0
|
7月前
|
存储 前端开发 算法
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣(下)
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣
21 0
|
6月前
|
容器
【LeetCode刷题】栈和队列题目练习~
【LeetCode刷题】栈和队列题目练习~
|
7月前
|
存储 C语言
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣(中)
从C语言到C++_18(stack和queue的常用函数+相关练习)力扣
38 0
|
7月前
|
存储 算法 搜索推荐
Leetcode算法题练习(一)
Leetcode算法题练习(一)
87 0
数据结构-顺序表-力扣题练习
数据结构-顺序表-力扣题练习
47 1
|
存储 算法
(C语言版)力扣(LeetCode)+牛客网(nowcoder)二叉树基础oj练习
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
(C语言版)力扣(LeetCode)+牛客网(nowcoder)二叉树基础oj练习
|
算法
时间复杂度、空间复杂度实践练习(力扣OJ)
时间复杂度、空间复杂度实践练习(力扣OJ)
105 0
【数据结构】11道LeetCode链表OJ练习
对于链表,你真的全部学懂了吗,赶快来练习一下叭!
|
算法
数据结构算法leetcode刷题练习(1)
数据结构算法leetcode刷题练习(1)