第一题
题目
定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
思路
这道题最开始的思路和昨天杨辉三角思路一样,但是咱也不能天天一点进步也没有啊,是吧,优化一下空间。
代码
public List<Integer> getRow(int rowIndex) {
List<Integer> row = new ArrayList<Integer>();
row.add(1);
for(int i = 1; i < rowIndex + 1; i++) {
row.add(0);
for(int j = i; j > 0; j--) {
row.set(j, row.get(j-1) + row.get(j));
};
};
return row;
}
第二题
题目
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
思路
暴力破解超出时间限制,啧!
这是官方题解:
据说使用动态规划,
假设,前i天的最高利润为数组daysMax[i];
第i天的利润为prices[i] - min(prices[0], prices[1],... prices[i - 1]);
那么第i天的最高利润为daysMax[i] = max(daysMax[i-1], prices[i] - min(prices[0], prices[1],... prices[i - 1]);
所以最高利润为数组daysMax的max
这是复习时候自己想出来的 大同小异吧,设置min为第i天之前的最小值,max为截止到第i天最大的获利-代码看上去比上面的易懂
代码
public int maxProfit(int[] prices) {
int minNum = prices[0];
int[] dp = new int[prices.length];
int maxValue = 0;
for(int i = 1; i < prices.length; i++) {
int prefer = prices[i] - minNum;
dp[i] = prefer > 0 ? prefer : 0;
dp[i] = dp[i - 1] - dp[i] > 0 ? dp[i - 1] : dp[i];
maxValue = maxValue > dp[i] ? maxValue : dp[i];
if(prices[i] < minNum) {
minNum = prices[i];
};
};
return maxValue;
}
复习后的代码
public int maxProfit(int[] prices) {
if(prices.length == 1) return 0;
int minPre = prices[0], maxRes = 0;
for(int i = 1; i < prices.length; i++) {
maxRes = Math.max(prices[i] - minPre, maxRes);
minPre = Math.min(minPre, prices[i]);
};
return maxRes;
}
第三题
题目
给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
思路
1、暴力破解-不写了
2、排序,然后递归查找-不想写,有时间补充
3、还有哈希,这个有时间补充一下
没了,但是,发现了一个非常6的方法,异或
代码
异或
public int singleNumber(int[] nums) {
// 暴力破解不写了,怕又有什么超出限制
// 异或666
int res = nums[0];
for(int i = 1; i < nums.length; i++) {
res = res ^ nums[i];
}
return res;
}
代码释义
两两异或就只剩0了,然后0再和最后的一个数字异或得到最终值