public int maxProfit (int[] prices) {
// write code here
int max = 0;
int margin = 0;
int buyDay = 0;
for (int i = 0; i < prices.length; i++)
{
margin = prices[i] - prices[buyDay];
if(margin>max) {
max = margin;
}
if(margin<0) {
buyDay = i;
}
}
return max;
}
参考数据结构与算法分析java语言描述里的论述
大概思路
设置margin,一旦margin大于max,就重置差值起点,继续寻找最大值;
NC9 二叉树中和为某一值的路径(一)
解法1:递归算法
/**
*
* @param root TreeNode类
* @param sum int整型
* @return bool布尔型
*/
static boolean flag = false;
public boolean hasPathSum(TreeNode root, int sum)
{
// write code here
if(root==null)
return false;
sum = sum - root.val;
if(flag);
if (root.left != null)
{
hasPathSum(root.left, sum);
}
if (root.right != null)
{
hasPathSum(root.right, sum);
}
if (root.left == null && root.right == null && sum == 0)
{
flag = true;
}
return flag;
}
public int FindGreatestSumOfSubArray(int[] array) {
int[] dp = new int[array.length];
int max = array[0];
dp[0] = array[0];
for(int i=1;i<array.length;i++){
// 动态规划,状态转移方程,确定dp[i]的最大值
dp[i] = Math.max(dp[i-1] + array[i], array[i]);
// 每次比较,保存出现的最大值
max = Math.max(max,dp[i]);
}
return max;
}
==方法3:优化动态规划,时间复杂度O(n),空间复杂度O(1)==!!!!
public int FindGreatestSumOfSubArray(int[] array) {
int sum = 0;
int max = array[0];
for(int i=0;i<array.length;i++){
// 优化动态规划,确定sum的最大值
sum = Math.max(sum + array[i], array[i]);
// 每次比较,保存出现的最大值
max = Math.max(max,sum);
}
return max;
}
NC22 合并两个有序的数组
/*
* 最优解:从后往前处理,不需要开辟额外空间
*/
public void merge(int[] nums1, int m, int[] nums2, int n) {
int i = m - 1, j = n - 1, index = m + n - 1;
while (i >= 0 && j >= 0)
nums1[index--] = nums1[i] > nums2[j] ? nums1[i--] : nums2[j--];
while (j >= 0)
nums1[index--] = nums2[j--];
}
//整洁!
注意对数组的访问尽可能避免越界
NC32 求平方根
我的思路
二分法,但是mid*mid会溢出,所以转换为long类型
public int sqrt2(int x)
{
// write code here
long longx = x;
long left = 1;
long right = x;
long mid = (left + right) / 2;
while (right - left > 1)
{
if (mid * mid == longx)
left = right;
else if (mid * mid > longx)
{
right = (left + right) / 2;
mid = (left + right) / 2;
} else
{
left = (left + right) / 2;
mid = (left + right) / 2;
}
}
return (int) mid;
}
改良二分法
public int sqrt1(int x)
{
// write code here
if(x<2)
{
return x;
}
int left = 0;
int right = x;
int mid = left + (right - left) / 2;
int tempSqrt = x / mid;
while (right-left>1)
{
if (mid == tempSqrt)
return tempSqrt;
else if (mid > tempSqrt)
{
right = mid;
mid = left + (right - left) / 2;// 避免了溢出
} else
{
left = mid;
mid = left + (right - left) / 2;
}
tempSqrt = x / mid;
}
return left;
}
NC34 求路径
我的想法
动态规划题型
1
1
1
1
1+1=2
1+2=3
1
2+1=3
3+3=6
public int uniquePaths(int m, int n)
{
// write code here
int[][] paths = new int[m][n];
Arrays.fill(paths[0], 1);
for (int i = 0; i < paths.length; i++)
{
paths[i][0] = 1;
}
int i = 1;
int j = 1;
while (i != paths.length & j != paths[0].length)
{
while (j <= paths[0].length-1)
{
paths[i][j] = paths[i - 1][j] + paths[i][j - 1];
j++;
}
j=i;
i++;
while (i <= paths.length-1)
{
paths[i][j] = paths[i - 1][j] + paths[i][j - 1];
i++;
}
j++;
i=j;
}
return paths[m - 1][n - 1];
}