----------------------------------------------------------------------------

41. 缺失的第一个正数

public int firstMissingPositive(int[] nums) {
        if(nums == null || nums.length == 0){
            return 1;
        }
        int len = nums.length;
        for (int i = 0; i < len ; i++) {
            while (nums[i] >0 && nums[i] <= len && nums[i]!=nums[nums[i]-1]){
                swap(nums,i,nums[i]-1);
            }
        }
        int res = 1;

        for (int i = 0; i < len; i++) {
            if(nums[i] != i+1){
                break;
            }
            res++;
        }

        return res;
    }

    private void swap(int[] nums,int i, int j){
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }

leetcode 48. 旋转图像

public void rotate(int[][] matrix) {
        if (matrix == null || matrix.length == 0) {
            return;
        }
        int rowStart = 0;
        int colStart = 0;
        int rowEnd = matrix.length - 1;
        int colEnd = matrix[0].length - 1;

        while (rowStart < rowEnd) {
            help(matrix,rowStart,colStart,rowEnd,colEnd);
            rowStart++;
            colStart++;
            rowEnd--;
            colEnd--;
        }

    }

    private void help(int[][] matrix, int rowStart, int colStart, int rowEnd, int colEnd) {
        int time = rowEnd - rowStart  ;
        for (int i = 0; i < time; i++) {
            int tmp = matrix[rowStart][colStart + i];
            matrix[rowStart][colStart + i] = matrix[rowEnd - i][colStart];
            matrix[rowEnd - i][colStart] = matrix[rowEnd][colEnd - i];
            matrix[rowEnd][colEnd - i] = matrix[rowStart + i][colEnd];
            matrix[rowStart + i][colEnd] = tmp;
        }
    }

leetcode 54. 螺旋矩阵

public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> list = new ArrayList<>();
        if (matrix == null || matrix.length == 0) {
            return list;
        }

        int startx = 0;
        int starty = 0;
        int endx = matrix.length-1;
        int endy = matrix[0].length-1;
        while (startx < endx && starty < endy) {
            for (int i = starty; i < endy ; i++) {
                list.add(matrix[startx][i]);
            }
            for (int i = startx; i < endx ; i++) {
                list.add(matrix[i][endy]);

            }
            for (int i = endy; i > starty; i--) {
                list.add(matrix[endx][i]);

            }
            for (int i = endx ; i > startx; i--) {
                list.add(matrix[i][starty]);
            }
            startx++;
            endx--;
            starty++;
            endy--;
        }
        //只有一行时
        if(starty == endy){
            while (startx <= endx) {
                list.add(matrix[startx++][starty]);
            }
        }else {
            //只有一列时
            if(startx == endx){
                while (starty <= endy) {
                    list.add(matrix[startx][starty++]);
                }

            }

        }
        return list;
    }

leetcode 59. 螺旋矩阵 II

public int[][] generateMatrix(int n) {
        int[][] matrix = new int[n][n];
        if(n == 0){
            return matrix;
        }
        int num = 1;
        int startX = 0;
        int startY = 0;
        int endX = n-1;
        int endY = n-1;
        int tar = n*n;
        while (num <= tar){
            for (int i = startY; i <= endY ; i++) {
                matrix[startX][i] = num++;

            }
            startX++;
            for (int i = startX; i <= endX ; i++) {
                matrix[i][endY] = num++;
            }
            endY--;

            for (int i = endY; i >= startY ; i--) {
                matrix[endX][i] = num++;

            }
            endX--;
            for (int i = endX; i >= startX ; i--) {
                matrix[i][startY] = num++;

            }
            startY++;
        }
        return matrix;
 
    }

leetcode 66. 加一 

public int[] plusOne(int[] digits) {
        for (int i = digits.length - 1; i >= 0; i--) {
            digits[i]++;
            digits[i] = digits[i] % 10;
            if (digits[i] != 0){
                return digits;
            }
        }
        digits = new int[digits.length + 1];
        digits[0] = 1;
        return digits;
    }

leetcode 73. 矩阵置零

public void setZeroes(int[][] matrix) {
        if(matrix == null || matrix.length == 0){
            return;
        }
        int row = matrix.length;
        int col = matrix[0].length;
        boolean firstColHasZero = false;
        for (int i = 0; i < row ; i++) {
            //第一列是否有0值
            if(matrix[i][0] == 0){
                firstColHasZero = true;
            }
            for (int j = 1; j < col; j++) {
                if(matrix[i][j] == 0){
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }

            }

        }


        //行置零
        for (int i = 1; i < row; i++) {
            if(matrix[i][0] == 0){
                for (int j = 1; j <col; j++) {
                    matrix[i][j] = 0;
                }
            }
        }

        //列置零
        for (int i = 1; i < col; i++) {
            if(matrix[0][i] == 0){
                for (int j = 1; j<row; j++) {
                    matrix[j][i] = 0;
                }
            }
        }

        //第一行
        if(matrix[0][0] == 0){
            for (int j = 1; j <col; j++) {
                matrix[0][j] = 0;
            }
            
        }
        //第一列
        if(firstColHasZero){
            for (int i = 0; i < row ; i++) {
                matrix[i][0] = 0;
                
            }
        }

    }

 

------------------------------------------------------------------------------

210 Say you have an array for which the i th element is the price of a given stock on day i. If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), design an algorithm to find the maximum profit.

 

package leetcode;

/*created by fanqunsong
    Date : 2017/12/22
    Time : 16:32
    Tips:先买才能卖
    */
public class Solution210 {
    public static void main(String[] args) {
        int[] num = new int[]{1,2};
        System.out.println(maxProfit(num));
    }
    public static int maxProfit(int[] prices) {
        if(prices.length == 0 ||prices.length == 1 || prices == null){
            return 0;
        }
        int min = prices[0];
        int res = 0;
        for (int i = 1; i < prices.length; i++) {
            if(prices[i]>min){
                res = res > prices[i] - min?res : prices[i] - min;
            }
            else {
                min = prices[i];
            }
        }
        return res;
    }
}

42. 接雨水 

public int trap(int[] height) {

        if(height == null || height.length < 3){
            return 0;
        }
        //left[i]表示第i列左边的最高的列值,包含第i列
        int[] left = new int[height.length];

        left[0] = height[0];

        for (int i = 1; i < height.length ; i++) {
            left[i] = left[i-1] > height[i]?left[i-1] : height[i];
        }
        //right[i]表示第i列右边的最高的列值,包含第i列
        int[] right = new int[height.length];

        right[height.length -1] = height[height.length-1];

        for (int i = height.length-2; i >= 0 ; i--) {
            right[i] = right[i+1] > height[i]?right[i+1] : height[i];
        }
        int sum = 0;
        for (int i = 1; i < height.length-1 ; i++) {
            sum += Math.min(left[i],right[i])-height[i];
        }
        return sum;

    }

-------------------------------------------------------------------------------------

 

 

209 Say you have an array for which the i th element is the price of a given stock on day i. Design an algorithm to find the maximum profit.

You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple times).

However, you may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

package leetcode;

/*created by fanqunsong
    Date : 2017/12/22
    Time : 17:09
    */
public class Solution209 {
    public static void main(String[] args) {
        int[] num = new int[]{1,2};
        System.out.println(maxProfit(num));
    }
    public static int maxProfit(int[] prices) {
        if(prices.length == 0 ||prices.length == 1 || prices == null){
            return 0;
        }
        int[] profit = new int[prices.length-1];
        for (int i = 1; i < prices.length; i++) {
            profit[i-1] = prices[i] - prices[i-1];
        }
        int sum = 0;
        for (int i = 0; i < profit.length; i++) {
            if (profit[i]>0){
                sum += profit[i];
            }
        }
        return sum;

    }
}

 

------------------------------------------------------------------------------------

 

 

401 Given two sorted integer arrays A and B, merge B into A as one sorted array. Note: You may assume that A has enough space to hold additional elements from B.

The number of elements initialized in A and B are m and n respectively.

 

package leetcode;

/*created by fanqunsong
    Date : 2017/12/21
    Time : 16:59
    */
/*
 Given two sorted integer arrays A and B, merge B into A as one sorted array.

Note:
You may assume that A has enough space to hold additional elements from B.
The number of elements initialized in A and B are m and n respectively.
 */

/*
tips:从后往前记录
 */
public class Solution401 {
    public void merge(int A[], int m, int B[], int n) {
        int j = m+n-1;
        m--;
        n--;
        while(m>=0 && n>=0){
            A[j--] = A[m] > B[n]? A[m--] : B[n--];
        }
        if(n>=0){
            while (n>=0){
                A[j--] = B[n--];
            }
        }
    }
}

 

 

 

 

 

-------------------------------------

502 Given a number represented as an array of digits, plus one to the number

 

public class Solution {
    public int[] plusOne(int[] digits) {
        int sum = digits.length;
        digits[sum-1] ++;
        for (int i = sum-1; i >0 ; i--) {
            if(digits[i]>9){
                digits[i] = 0;
                digits[i-1]++;
            }
        }
        if(digits[0]<10){
            return digits;
        }
        int[] res = new int[sum+1];
        res[0] = 1;
        res[1] = 0;
        for (int i = 2; i <= sum ; i++) {
            res[i] = digits[i-1];
        }
        return res;
    }
}


-------------------------------------

leetcode 54. 螺旋矩阵

public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> list = new ArrayList<>();
        if (matrix == null || matrix.length == 0) {
            return list;
        }

        int startx = 0;
        int starty = 0;
        int endx = matrix.length-1;
        int endy = matrix[0].length-1;
        while (startx < endx && starty < endy) {
            for (int i = starty; i < endy ; i++) {
                list.add(matrix[startx][i]);
            }
            for (int i = startx; i < endx ; i++) {
                list.add(matrix[i][endy]);

            }
            for (int i = endy; i > starty; i--) {
                list.add(matrix[endx][i]);

            }
            for (int i = endx ; i > startx; i--) {
                list.add(matrix[i][starty]);
            }
            startx++;
            endx--;
            starty++;
            endy--;
        }
        //只有一行时
        if(starty == endy){
            while (startx <= endx) {
                list.add(matrix[startx++][starty]);
            }
        }else {
            //只有一列时
            if(startx == endx){
                while (starty <= endy) {
                    list.add(matrix[startx][starty++]);
                }

            }

        }
        return li

leetcode 59. 螺旋矩阵 II

public int[][] generateMatrix(int n) {
        int[][] matrix = new int[n][n];
        if(n == 0){
            return matrix;
        }
        int num = 1;
        int startX = 0;
        int startY = 0;
        int endX = n-1;
        int endY = n-1;
        int tar = n*n;
        while (num <= tar){
            for (int i = startY; i <= endY ; i++) {
                matrix[startX][i] = num++;

            }
            startX++;
            for (int i = startX; i <= endX ; i++) {
                matrix[i][endY] = num++;
            }
            endY--;

            for (int i = endY; i >= startY ; i--) {
                matrix[endX][i] = num++;

            }
            endX--;
            for (int i = endX; i >= startX ; i--) {
                matrix[i][startY] = num++;

            }
            startY++;
        }
        return matrix;

    }

---

leetcode 66. 加一

public int[] plusOne(int[] digits) {
        for (int i = digits.length - 1; i >= 0; i--) {
            digits[i]++;
            digits[i] = digits[i] % 10;
            if (digits[i] != 0) return digits;
        }
        digits = new int[digits.length + 1];
        digits[0] = 1;
        return digits;

        
    }