贪心
1. 买卖股票的最佳时机 题目链接
题目要求:给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。 代码及思路
使用贪心算法,局部最优求全局最优 假设在第一天就买入股票,然后从第二天开始每天用当天的价格计算利润更新最大利润 在遍历过程中,以更低的价格更新买入股票价格 代码
class Solution {
public int maxProfit ( int [ ] prices) {
int buy= prices[ 0 ] ;
int maxValue= 0 ;
for ( int i= 1 ; i< prices. length; i++ ) {
maxValue= Math. max ( maxValue, prices[ i] - buy) ;
if ( prices[ i] < buy) {
buy= prices[ i] ;
}
}
return maxValue;
}
}
2. 最大子数组和 题目链接
题目要求:给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组中的一个连续部分。 代码及思路
使用贪心算法来解决,遍历数组求和,当sum大于0时sum对后面子数组的贡献为正,可以继续求和;当sum小于0时对后面的子数组贡献是负的,因此sum重新开始 每次使用sum和当前最大和res比较,更新res 代码
class Solution {
public int maxSubArray( int[ ] nums) {
int res = Integer.MIN_VALUE;
int sum = 0 ;
for( int i = 0 ; i< nums.length; i++) {
sum += nums[ i] ;
res = Math.max( res,sum) ;
if( sum< 0 ) {
sum = 0 ;
}
}
return res;
}
}
图论
题目要求:给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包围。 代码及思路
本题使用深度遍历的方式计算岛屿数量 遍历网格,碰到一个为‘1’的网格则岛屿数量加1 然后从四个方向上进行深度遍历,将遇到的所有的为‘1’的网格变成‘0’,直到遇到不是‘1’的网格 代码
class Solution {
public int numIslands( char[ ] [ ] grid) {
int res = 0 ;
for( int i = 0 ; i< grid.length; i++) {
for( int j = 0 ; j< grid[ 0 ] .length; j++) {
if( grid[ i] [ j] == '1' ) {
res++;
dfs( grid,i,j) ;
}
}
}
return res;
}
private void dfs( char[ ] [ ] grid,int i,int j) {
if( i< 0 || i>= grid.length|| j< 0 || j>= grid[ 0 ] .length|| grid[ i] [ j] != '1' ) return;
grid[ i] [ j] = '0' ;
dfs( grid,i-1,j) ;
dfs( grid,i+1,j) ;
dfs( grid,i,j-1) ;
dfs( grid,i,j+1) ;
}
}
题目要求:给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。 代码及思路
使用深度优先遍历的方式解决问题,也可以使用广度优先遍历 对board中每一个字符遍历,从该字符开始深度优先寻找word 注意遍历结束条件 代码
class Solution {
public boolean exist ( char [ ] [ ] board, String word) {
for ( int i= 0 ; i< board. length; i++ ) {
for ( int j= 0 ; j< board[ 0 ] . length; j++ ) {
if ( dfs ( board, i, j, word, 0 ) ) {
return true ;
}
}
}
return false ;
}
private boolean dfs ( char [ ] [ ] board, int i, int j, String word, int k) {
if ( k== word. length ( ) ) return true ;
if ( i< 0 || i>= board. length|| j< 0 || j>= board[ 0 ] . length|| board[ i] [ j ] != word. charAt ( k) ) return false ;
board[ i] [ j ] = '\0' ;
boolean flag= dfs ( board, i+ 1 , j, word, k+ 1 ) || dfs ( board, i- 1 , j, word, k+ 1 ) || dfs ( board, i, j+ 1 , word, k+ 1 ) || dfs ( board, i, j- 1 , word, k+ 1 ) ;
board[ i] [ j ] = word. charAt ( k) ;
return flag;
}
}