刷题笔记(一)

本文旨在记录在第一遍刷题时的一些想法,心得以及遇到的困难等等 作为以后的复习参考

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.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值