力扣爆刷第105天之CodeTop100五连刷11-15

2024-03-27 12:36

本文主要是介绍力扣爆刷第105天之CodeTop100五连刷11-15,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

力扣爆刷第105天之CodeTop100五连刷11-15

文章目录

      • 力扣爆刷第105天之CodeTop100五连刷11-15
      • 一、5. 最长回文子串
      • 二、33. 搜索旋转排序数组
      • 三、102. 二叉树的层序遍历
      • 四、200. 岛屿数量
      • 五、121. 买卖股票的最佳时机

一、5. 最长回文子串

题目链接:https://leetcode.cn/problems/longest-palindromic-substring/description/
思路:求最长回文子串,要以单点为中心或以双点为中心,向左右进行扩散,然后遍历字符串,在每一个点位上向两边进行扩散,然后记录即可。

class Solution {public String longestPalindrome(String s) {String max = "";for(int i = 0; i < s.length(); i++) {String s1 = find(s, i, i);String s2 = find(s, i, i+1);max = s1.length() > max.length() ? s1 : max;max = s2.length() > max.length() ? s2 : max;}return max;}String find(String s, int i, int j) {while(i >= 0 && j <= s.length()-1) {if(s.charAt(i) != s.charAt(j)) {break;}i--;j++;}return s.substring(i+1, j);}
}

二、33. 搜索旋转排序数组

题目链接:https://leetcode.cn/problems/search-in-rotated-sorted-array/description/
思路:对于二分法有几个定理。
定理一:只有在顺序区间里才能通过区间两端的值来判断target是否存在其中。
定理二:判断是顺序区间还是乱序区间,只需要看nums[left]是否小于等于nums[right],小于等于的话即顺序,其他乱序。
定理三:每次二分都至少会确定一个顺序区间。
那么本题就可以不停的二分,然后进入其中的顺序区间,看看target是否在这段顺序区间内(通过两端数值即可判断),在的话就往其内移动指针,不在就往反方向移动指针,即可。
也就是下面说的:
将数组一分为二,其中一定有一个是有序的,另一个可能是有序,也能是部分有序。
此时有序部分用二分法查找。无序部分再一分为二,其中一个一定有序,另一个可能有序,可能无序。就这样循环.
在这里插入图片描述

class Solution {public int search(int[] nums, int target) {int left = 0, right = nums.length - 1;while(left <= right) {int mid = left + (right - left) / 2;if(nums[mid] == target) return mid;if(nums[left] <= nums[mid]) {if(nums[left] <= target && target < nums[mid]) {right = mid - 1;}else{left = mid + 1;}}else{if(nums[mid] < target && target <= nums[right]) {left = mid + 1;}else{right = mid - 1;}}}return -1;}}

三、102. 二叉树的层序遍历

题目链接:https://leetcode.cn/problems/binary-tree-level-order-traversal/description/
思路:层序遍历使用队列,靠队列长度表示层宽,遍历即可。

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {List<List<Integer>> arrayList = new ArrayList<>();public List<List<Integer>> levelOrder(TreeNode root) {if(root == null) return arrayList;Deque<TreeNode> queue = new LinkedList<>();queue.add(root);while(!queue.isEmpty()) {int size = queue.size();List<Integer> list = new ArrayList<>();for(int i = 0; i < size; i++) {TreeNode node = queue.poll();list.add(node.val);if(node.left != null) {queue.add(node.left);}if(node.right != null){queue.add(node.right);}}arrayList.add(list);}return arrayList;}
}

四、200. 岛屿数量

题目链接:https://leetcode.cn/problems/number-of-islands/description/
思路:深度优先算法,是岛屿就标记为海洋,每次递归结束岛屿计数加一。

class Solution {public int numIslands(char[][] grid) {int count = 0;for(int i = 0; i < grid.length; i++) {for(int j = 0; j < grid[0].length; j++) {if(grid[i][j] == '1') {dfs(grid, i, j);count++;}}}return count++;}void dfs(char[][] grid, int x, int y) {if(x < 0 || x >= grid.length || y < 0 || y >= grid[0].length || grid[x][y] == '0') return;grid[x][y] = '0';dfs(grid, x-1, y);dfs(grid, x+1, y);dfs(grid, x, y-1);dfs(grid, x, y+1); }}

五、121. 买卖股票的最佳时机

题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/
思路:买卖股票是典型的动态规划题,对于这类题型,每一天有两种状态,即持有和不持有。对于持有可以是之前就持有了,也可以是今天才持有的。对于不持有可以是之前就不持有了,也可以是今天才持有的。
对于dp[i]的定义是经过第i天,所能获取的最大利润。因此我们就要对于所有的状态,进行对应的选择,动态规划就是状态与选择。

class Solution {public int maxProfit(int[] prices) {int[] dp = new int[2];dp[0] = -prices[0];for(int i = 1; i < prices.length; i++) {dp[0] = Math.max(dp[0], -prices[i]);dp[1] = Math.max(dp[1], dp[0] + prices[i]);}return dp[1];}
}

本题还可以使用贪心来做:遍历的过程中一直记录最小值,然后一直用当前值减去最小值来更新最大值。

class Solution {public int maxProfit(int[] prices) {int max = 0, min = Integer.MAX_VALUE;for(int i = 0; i < prices.length; i++) {min = Math.min(min, prices[i]);max = Math.max(max, prices[i] - min);}return max;}
}

这篇关于力扣爆刷第105天之CodeTop100五连刷11-15的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/852116

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

两数之和--力扣1

两数之和 题目思路C++代码 题目 思路 根据题目要求,元素不能重复且不需要排序,我们这里使用哈希表unordered_map。注意题目说了只对应一种答案。 所以我们在循环中,使用目标值减去当前循环的nums[i],得到差值,如果我们在map中能够找到这个差值,就说明存在两个整数的和为目标值。 如果没有找到,就将当前循环的nums[i]以及下标i放入map中,以便后续查

Adblock Plus官方规则Easylist China说明与反馈贴(2015.12.15)

-------------------------------特别说明--------------------------------------- 视频广告问题:因Adblock Plus的局限,存在以下现象,优酷、搜狐、17173黑屏并倒数;乐视、爱奇艺播放广告。因为这些视频网站的Flash播放器被植入了检测代码,而Adblock Plus无法修改播放器。 如需同时使用ads

力扣第347题 前K个高频元素

前言 记录一下刷题历程 力扣第347题 前K个高频元素 前K个高频元素 原题目: 分析 我们首先使用哈希表来统计数字出现的频率,然后我们使用一个桶排序。我们首先定义一个长度为n+1的数组,对于下图这个示例就是长度为7的数组。为什么需要一个长度为n+1的数组呢?假如说总共有三个数字都为1,那么我们需要把这个1放在数组下标为3的位置,假如说数组长度为n,对于这个例子就是长度为3,那么它的

15 组件的切换和对组件的data的使用

划重点 a 标签的使用事件修饰符组件的定义组件的切换:登录 / 注册 泡椒鱼头 :微辣 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-

【数据结构与算法 | 灵神题单 | 删除链表篇】力扣3217, 82, 237

总结,删除链表节点问题使用到列表,哈希表,递归比较容易超时,我觉得使用计数排序比较稳,处理起来也不是很难。 1. 力扣3217:从链表中移除在数组中的节点 1.1 题目: 给你一个整数数组 nums 和一个链表的头节点 head。从链表中移除所有存在于 nums 中的节点后,返回修改后的链表的头节点。 示例 1: 输入: nums = [1,2,3], head = [1,2,3,

力扣 739. 每日温度【经典单调栈题目】

1. 题目 理解题意: 1.1. 给一个温度集合, 要返回一个对应长度的结果集合, 这个结果集合里面的元素 i 是 当前 i 位置的元素的下一个更高温度的元素的位置和当前 i 位置的距离之差, 若是当前元素不存在下一个更高温度的元素, 则这个位置用0代替; 2. 思路 本题用单调栈来求解;单调栈就适用于来求当前元素左边或者右边第一个比当前元素大或者小的元素;【单调栈:让栈中的元素保持单调

力扣接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 示例 2: 输入:height

每日一题,力扣leetcode Hot100之238.除自身以外数组的乘积

乍一看这个题很简单,但是不能用除法,并且在O(N)时间复杂度完成或许有点难度。 考虑到不能用除法,如果我们要计算输出结果位置i的值,我们就要获取这个位置左边的乘积和右边的乘积,那么我新设立两个数组L和R。 对于L来说,由于表达的是位置i左边的数的乘积,那么L[0]=1,因为第一个数字左边没数那么为了不影响乘积初始值就设置为1,那么L[1]=L[0]*nums[0],那么L[i]=L[i-1