本文旨在记录在第一遍刷题时的一些想法,心得以及遇到的困难等等 作为以后的复习参考
1. LC 561 Array Partition I
题目 :给一个2n的数组两两结合 并取出最小值 然后对n个最小值求和取最大值
思路:因为要最小值的和最大 那么就要保证每两个数的差值尽量小 这样损失的值最少。 所以我的想法时利用Arrays.sort进行排序,再两个两个一组分别取出最小值。 这样求得的和最大
class Solution {
public int arrayPairSum(int[] nums) {
int total=0;
int size=nums.length;
Arrays.sort(nums);
for(int i=0;i<=size-1;i=i+2){
total=total+nums[i];
}
return total;
}
}
2.LC 766 Toeplitz Matrix
题目:给定一个矩阵判断是否为 常对角矩阵 (即沿对角线方向是否对称)
思路:看了discuss以后 可以比较巧妙地比较所有m[i][j]与m[i+1][j+1]的值是否相同
class Solution {
public boolean isToeplitzMatrix(int[][] matrix) {
for(int i=0;i<matrix.length-1;i++){
for(int j=0;j<matrix[i].length-1;j++){
if(matrix[i][j]!=matrix[i+1][j+1]){return false;}
}
}
return true;
}
}
3.695 Max island area.
题目:给定一个grid,求出该grid中最大1 island的面积 1仅以上下左右相连为联通
思路:一开始的思考点在于如何确定并且求取每个联通分量的大小,于是最开始就想到了dfs. 并且注意要记得在遍历后将grid[i][j]置0. 想通这一点就很简单
class Solution {
public int maxAreaOfIsland(int[][] grid) {
int max=0;
int area=0;
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[0].length;j++){
if(grid[i][j]==1){
area=dfs(grid,i,j);
max=Math.max(area,max);
}
}
}
return max;
}
public int dfs(int[][] grid, int i, int j){
if(i>=0&&i<grid.length&&j>=0&&j<grid[0].length&&grid[i][j]==1){
grid[i][j]=0;
return 1+dfs(grid,i-1,j)+dfs(grid,i+1,j)+dfs(grid,i,j-1)+dfs(grid,i,j+1);
}
return 0;
}
}
4. LC 121 Best time to sell stock
题目:只能买卖一次, 问如何交易利润最大, 题目隐含的是卖出时高价要在买入之后。
思路:一开始第一次没有想出来 不过第二次想到可以记录到目前为止的最小值,然后不断计算当前值与最小值的差值,直至一遍遍历结束即求出可能的最大值
class Solution {
public int maxProfit(int[] prices) {
int maxprofit=0;
int min=100000;
for(int i=0;i<prices.length;i++){
if(prices[i]<min){
min=prices[i];
}
if(prices[i]-min>maxprofit){
maxprofit=Math.max(maxprofit,prices[i]-min);
}
}
return maxprofit;
}
}
5. Best time to sell stock II
题目:无限次交易 以求得利润最大值 一次手上只能有一笔
思路:最大自然是[i+1]比[i]大的话就买卖一次 求出所有满足的子区间求和即可 看了别人的discuss以后 作为greedy的思想 不过想了挺久的
class Solution {
public int maxProfit(int[] prices) {
int res= 0;
for(int i=0;i<prices.length-1;i++){
if(prices[i]<prices[i+1]){
res=res+prices[i+1]-prices[i];
}
}
return res;
}
}
6. LC 167 Two Sum I/II
题目:给一个递增序列的Array , 求出index的值 这里有个坑时题目说不许用same element 不代表不能用两个值相同的元素
即[0,0,3] 0这种依然可以返回[1,2]
思路:一开始看到这题考虑的就是用hashmap 但是当第一遍提交之后发现没有考虑上面提到的那种情况 因为hashmap不能有两个key相同的键值对 所以如果保存后面的 则会将前面的index覆盖这并不是我们所希望的。 这里一个很tricky的方法是 我们不存nums[i]本身 而存 target-nums[i], 这样在后面碰到有满足条件的值就可以返回前面一个的value以及当前的i 同时这样也解决了使用值相同数的问题 如[4,4,5] 8 第一次存入的是(8-4,0)再进一步 先判断map.containsKey(num[1])-->即有需要4的 则返回了前一个4的下标0 求出了对应的组合
class Solution {
public int[] twoSum(int[] numbers, int target) {
HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();
int[] res=new int[2];
for(int i=0;i<numbers.length;i++){
if(!map.containsKey(numbers[i])){
map.put(target-numbers[i],i);
}else{
res[0]=map.get(numbers[i]);
res[1]=i;
}
}
return res;
}
}
7.