zoukankan      html  css  js  c++  java
  • LeetCode解题报告—— Rotate List & Set Matrix Zeroes & Sort Colors

    1. Rotate List

    Given a list, rotate the list to the right by k places, where k is non-negative.

    Example:

    Given 1->2->3->4->5->NULL and k = 2,
    
    return 4->5->1->2->3->NULL.

    思路:这题感觉有点没有说清楚,如果k大于了链表长度该怎么办呢?这个时候怎么确定旋转位置呢?从右往左数,超出数组长度则取余。所以第一步是确定数组长度,结合k来确定旋转位置,然后再作旋转。

    Since n may be a large number compared to the length of list. So we need to know the length of linked list.After that, move the list after the (l-n%l )th node to the front to finish the rotation.

    Ex: {1,2,3} k=2 Move the list after the 1st node to the front

    Ex: {1,2,3} k=5, In this case Move the list after (3-5%3=1)st node to the front.

    public ListNode rotateRight(ListNode head, int n) {
        if (head==null||head.next==null) return head;
        ListNode dummy=new ListNode(0);
        dummy.next=head;
        ListNode fast=dummy,slow=dummy;
    
        int i;
        for (i=0;fast.next!=null;i++)//Get the total length 
            fast=fast.next;
        
        for (int j=i-n%i;j>0;j--) //Get the i-n%i th node
            slow=slow.next;
        
        fast.next=dummy.next; //Do the rotation
        dummy.next=slow.next;
        slow.next=null;
        
        return dummy.next;
    }

    2. Set Matrix Zeroes

    Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.

    思路:这题可以用遍历的方式取求解,但关键是如何在O(1)的空间复杂度内求解这题。一个可行的想法是,先遍历一遍矩阵,将元素为0的那一行和那一列的第一个元素标记为0,然后从第二行第二列开始遍历矩阵。如果这行或者这列的开始元素是0则将这个元素置为0,剩下一个要做的是处理将第一行和第一列上要置为0的元素。

    import java.util.*;
    
    public class LeetCode{
        public static void main(String[] args){
            Scanner sc=new Scanner(System.in);
            int m=sc.nextInt();
            int n=sc.nextInt();
            
            int[][] matrix=new int[m][n];
         // 老实说输入一个矩阵真的是超级烦,这里不加这个就会输入异常,大概是因为上面的nextInt()不会读入换行符?
            sc.nextLine();
            for(int i=0;i<m;i++){
                String input=sc.nextLine();
                String[] inputs=input.split(",");
                for(int j=0;j<inputs.length;j++){
                    matrix[i][j]=Integer.parseInt(inputs[j]);
                }
            }
            SetZeros(matrix);
            for(int i=0;i<matrix.length;i++){
                for(int j=0;j<matrix.length;j++){
                    System.out.print(matrix[i][j]+" ");
                }
                System.out.println();
            }
        }
        
        static void SetZeros(int[][] matrix){
            boolean fr=false, fc=false;
            for(int i=0;i<matrix.length;i++){
                for(int j=0;j<matrix[0].length;j++){
                    if(matrix[i][j]==0){
                        if(i==0)fr=true;
                        if(j==0)fc=true;
                        matrix[i][0]=0;
                        matrix[0][j]=0;
                    }
                }
            }
            
            for(int i=1;i<matrix.length;i++){
                for(int j=1;j<matrix.length;j++){
                    if(matrix[i][0]==0||matrix[0][j]==0)
                        matrix[i][j]=0;
                }
            }
            
            if(fr==true){
                for(int j=0;j<matrix[0].length;j++)
                    matrix[0][j]=0;
            }
            if(fc==true){
                for(int i=0;i<matrix.length;i++)
                    matrix[i][0]=0;
            }
        }
    }

    3. Sort Colors

    Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue.

    Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.

    Note:
    You are not suppose to use the library's sort function for this problem.

    Follow up:
    A rather straight forward solution is a two-pass algorithm using counting sort.
    First, iterate the array counting number of 0's, 1's, and 2's, then overwrite array with total number of 0's, then 1's and followed by 2's.

    Could you come up with an one-pass algorithm using only constant space?

    思路:可以扫描一遍记录0,1,2的个数然后新建个数组即可。但是如何再O(1)的空间复杂度内完成?可以借鉴快速排序的思想,两个指针分别从左右扫面,左边如果遇到0,那么将它与最低(左)位交换,这时确定了最左边一定是0,所以最低位加1,同时i要加1,这里为什么i要加1呢?可以肯定的一点是无论位置i上交换后是几都无关紧要,因为low肯定是小于等于i的,low在一路加过来的过程中就已经把相应的位置全置为0了。如果遇到的是2,那么将其与最大位置(最右边)交换,最大位减1,此时i不加1,因为如果交换后i位置上是2的话,那么i再加1的话这个2就无法挪到最右边。。简而言之这个过程就是,从左往右扫面数组,遇到的0全堆积在左边,遇到的2全堆积到右边,那么中间剩下的部分就全是1了。
    import java.util.*;
    
    public class LeetCode{
        public static void main(String[] args){
            Scanner sc=new Scanner(System.in);
            String input=sc.nextLine();
            String[] inputs=input.split(",");
            int[] colors=new int[inputs.length];
            for(int i=0;i<inputs.length;i++){
                colors[i]=Integer.parseInt(inputs[i]);
            }
            sortColors(colors);
            for(int c:colors){
                System.out.print(c+" ");
            }
        }
        
        static void sortColors(int[] colors){
            if(colors==null||colors.length<2)
                return;
            int low=0,high=colors.length-1;
            for(int i=low;i<=high;){
                if(colors[i]==0){
                    int temp=colors[i];
                    colors[i]=colors[low];
                    colors[low]=temp;
                    i++;low++;
                }else if(colors[i]==2){
                    int temp=colors[i];
                    colors[i]=colors[high];
                    colors[high]=temp;
                    high--;
                }else{
                    i++;
                }
            }
        }
    }
  • 相关阅读:
    pandas 数据类型研究(三)数据类型object与category
    kaggle比赛实践M5-baseline研读
    pd.melt详解--列转行
    kaggle比赛实践M5-数据集介绍
    kaggle比赛实践M5-比赛介绍
    txNLP 335-374
    信息,熵,联合熵,条件熵,互信息(信息增益),交叉熵,相对熵(KL散度)
    框架SpringMVC笔记系列 二 传值
    项目总结笔记系列 Social Hub KT Session1
    读书笔记系列之java性能优化权威指南 一 第一章
  • 原文地址:https://www.cnblogs.com/f91og/p/8575236.html
Copyright © 2011-2022 走看看