一 :二叉树的坡度 DFS
class Solution {
int result= 0 ;
public int findTilt ( TreeNode root) {
if ( root== null ) {
return result;
}
DFS ( root) ;
return result;
}
public int DFS ( TreeNode root) {
int left= 0 ;
int right= 0 ;
if ( root. left!= null ) {
left= DFS ( root. left) ;
}
if ( root. right!= null ) {
right= DFS ( root. right) ;
}
result+= Math . abs ( left- right) ;
return left+ right+ root. val;
}
}
result用全局变量的形式存储,DFS树中每个结点,DFS返回的值是以node为根节点的树的权值总和。
二:移动零
class Solution {
public void moveZeroes ( int [ ] nums) {
if ( nums. length== 0 ) {
return ;
}
int left= 0 ;
int right= 0 ;
while ( right< nums. length) {
if ( nums[ right] != 0 ) {
int x= nums[ right] ;
nums[ right] = nums[ left] ;
nums[ left] = x;
left++ ;
}
right++ ;
}
}
}
T : O ( n)
M : O ( 1 )
当遍历到0的时候,left停止右移,right每次只向右移动一个,保证了数组的顺序不变。
三 两数之和
class Solution {
public int [ ] twoSum ( int [ ] numbers, int target) {
int left= 0 ;
int right= numbers. length- 1 ;
boolean tag= false ;
while ( left< right) {
if ( numbers[ left] + numbers[ right] < target) {
left++ ;
}
else if ( numbers[ left] + numbers[ right] == target) {
break ;
}
else {
right-- ;
}
}
int result[ ] = new int [ 2 ] ;
result[ 0 ] = left+ 1 ;
result[ 1 ] = right+ 1 ;
return result;
}
}
T : O ( n)
四: 爬楼梯
class Solution {
public int climbStairs ( int n) {
if ( n== 1 ) {
return 1 ;
}
if ( n== 2 ) {
return 2 ;
}
int result_2= 1 ;
int result_1= 2 ;
int result= 0 ;
for ( int i= 3 ; i<= n; i++ ) {
result= result_1+ result_2;
result_2= result_1;
result_1= result;
}
return result;
}
}
动态规划: 爬第n阶台阶可由n-2阶或者n-1阶爬上来,所以方案数f(n)=f(n-2)+f(n-1);
五:使用最小花费爬楼梯
class Solution {
public int minCostClimbingStairs ( int [ ] cost) {
int result= 0 ;
int f[ ] = new int [ cost. length] ;
f[ 0 ] = cost[ 0 ] ;
f[ 1 ] = cost[ 1 ] ;
for ( int i= 2 ; i< cost. length; i++ ) {
f[ i] = Math . min ( f[ i- 2 ] + cost[ i] , f[ i- 1 ] + cost[ i] ) ;
}
return Math . min ( f[ cost. length- 1 ] , f[ cost. length- 2 ] ) ;
}
}
T : O ( n)
六 打家劫舍
class Solution {
public int rob ( int [ ] nums) {
if ( nums. length== 1 ) {
return nums[ 0 ] ;
}
if ( nums. length== 0 ) {
return 0 ;
}
int f[ ] = new int [ nums. length] ;
f[ 0 ] = nums[ 0 ] ;
f[ 1 ] = Math . max ( nums[ 1 ] , nums[ 0 ] ) ;
for ( int i= 2 ; i< nums. length; i++ ) {
f[ i] = Math . max ( f[ i- 2 ] + nums[ i] , f[ i- 1 ] ) ;
}
return f[ nums. length- 1 ] ;
}
}