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

LeetCode解题报告—— Rotate List & Set Matrix Zeroes & Sort Colors的更多相关文章

  1. LeetCode解题报告:Linked List Cycle && Linked List Cycle II

    LeetCode解题报告:Linked List Cycle && Linked List Cycle II 1题目 Linked List Cycle Given a linked ...

  2. leetcode解题报告(2):Remove Duplicates from Sorted ArrayII

    描述 Follow up for "Remove Duplicates": What if duplicates are allowed at most twice? For ex ...

  3. LeetCode解题报告—— Permutations & Permutations II & Rotate Image

    1. Permutations Given a collection of distinct numbers, return all possible permutations. For exampl ...

  4. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

  5. leetCode解题报告5道题(六)

    题目一: Longest Substring Without Repeating Characters Given a string, find the length of the longest s ...

  6. LeetCode解题报告—— Group Anagrams & Pow(x, n) & Spiral Matrix

    1. Group Anagrams Given an array of strings, group anagrams together. For example, given: ["eat ...

  7. leetcode解题报告(20):Rotate Array

    描述 Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the arr ...

  8. leetcode解题报告(16):Move Zeroes

    描述 Given an array nums, write a function to move all 0's to the end of it while maintaining the rela ...

  9. LeetCode解题报告汇总! All in One!

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 把自己刷过的所有题目做一个整理,并且用简洁的语言概括了一下思路,汇总成了一个表格. 题目 ...

随机推荐

  1. 直通BAT面试算法精讲课 --动态规划

    1.有数组penny,penny中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim(小于等于1000)代表要找的钱数,求换钱有多少种方法. 给定数 ...

  2. [10.18模拟赛] 序列 (DP)

    [10.18模拟赛] 序列 题目描述 山山有一个整数序列s1,s2,-,sn,其中1≤si≤k. 求出有多少个准确移除m个元素后不同的序列.答案模(1e9+7) 输入 输入包括几个测试用例,并且由文件 ...

  3. D-query SPOJ - DQUERY(莫队)统计不同数的数量

    Given a sequence of n numbers a1, a2, ..., an and a number of d-queries. A d-query is a pair (i, j) ...

  4. C# 中的委托和事件(详解)

    C# 中的委托和事件 委托和事件在 .NET Framework 中的应用非常广泛,然而,较好地理解委托和事件对很多接触 C# 时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太 ...

  5. centos7下使用yum安装redis

    centos7下使用yum安装Redis 第一步:安装 yum –y install redis 第二步:启动 systemctl start redis.service 第三步:设置开机启动 sys ...

  6. session验证-使用filter过滤器

    public override void OnActionExecuting(ActionExecutingContext context) { string test = context.Contr ...

  7. PHP扩展--Yaf框架安装

    安装/配置 编译安装 wge thttp://pecl.php.net/get/yaf-2.3.5.tgz tar -zxvfyaf-2.3.5.tgz cd yaf-2.3.5/ cd extens ...

  8. 【BZOJ4816】【SDOI2017】数字表格 [莫比乌斯反演]

    数字表格 Time Limit: 50 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description Doris刚刚学习了fibonac ...

  9. Docker explainations

    What does docker run --link mean, what's the usage? link 是在两个contain之间建立一种父子关系,父container中的web,可以得到子 ...

  10. Drainage Ditches(POJ1273+网络流+Dinic+EK)

    题目链接:poj.org/problem?id=1273 题目: 题意:求最大流. 思路:测板子题,分别用Dinic和EK实现(我的板子跑得时间均为0ms). Dinic代码实现如下: #includ ...