leetcode 劍指offer刷題歸類之 三 數組篇

----------------------------------------------------------------------------html

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;
                
            }
        }

    }

 

------------------------------------------------------------------------------java

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.git

 

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;

    }

-------------------------------------------------------------------------------------app

 

 

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. ide

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

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

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;

    }
}

 

------------------------------------------------------------------------------------htm

 

 

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.ip

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

 

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;

        
    }
相關文章
相關標籤/搜索