程序员面试金典:机器人走方格II、魔术索引I
2017-07-23 08:56
197 查看
1.机器人走方格II
题目描述有一个XxY的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。注意这次的网格中有些障碍点是不能走的。
给定一个int[][] map(C++ 中为vector >),表示网格图,若map[i][j]为1则说明该点不是障碍点,否则则为障碍。另外给定int x,int y,表示网格的大小。请返回机器人从(0,0)走到(x - 1,y - 1)的走法数,为了防止溢出,请将结果Mod 1000000007。保证x和y均小于等于50
动态规划版本1
import java.util.*; public class Robot { public int countWays(int[][] map, int x, int y) { int [][]dp=new int[x][y]; for(int i=0;i<x;i++){ if(map[i][0]==1){ dp[i][0]=1; }else{ //否则dp[i][0]=0,后面的则访问不到了,用break结束 dp[i][0]=0; break; } } for(int i=0;i<y;i++){ if(map[0][i]==1){ dp[0][i]=1; }else{ dp[0][i]=0; break; } } //遍历格子 for(int i=1;i<x;i++){ for(int j=1;j<y;j++){ if(map[i][j]==1){ dp[i][j]=(dp[i-1][j]+dp[i][j-1])%1000000007; }else{ dp[i][j]=0; } } } return dp[x-1][y-1]; } }
动态规划版本2
牛客网小伙伴提供import java.util.*; public class Robot { public int countWays(int[][] map, int x, int y) { int dp[][]=new int[x][y]; for(int i=0;i<x;i++) for(int j=0;j<y;j++) { if(map[i][j] != 1)dp[i][j] = 0; // 不能走,就是方法数==0 else if(i==0 && j==0) dp[i][j] = 1; // 起点,1种走法 else if(i==0 && j!=0) dp[i][j] = dp[i][j-1]; // 上边沿:只能从左边来 else if(i!=0 && j==0) dp[i][j] = dp[i-1][j]; // 左边沿:只能从上边来 else dp[i][j] = (dp[i-1][j]+dp[i][j-1])%1000000007; // 其他点:左边+上边 } return dp[x-1][y-1]; } }
2.魔术索引I
题目描述在数组A[0..n-1]中,有所谓的魔术索引,满足条件A[i]=i。给定一个升序数组,元素值各不相同,编写一个方法,判断在数组A中是否存在魔术索引。请思考一种复杂度优于o(n)的方法。
给定一个int数组A和int n代表数组大小,请返回一个bool,代表是否存在魔术索引。
测试样例:
[1,2,3,4,5]
返回:false
二分查找
【运行时间:50ms 占用内存:1092k】import java.util.*; public class MagicIndex { public boolean findMagicIndex(int[] A, int n) { if(A==null||n==0) return false; int start=0; int end=n-1; while(start<=end){ int mid=(start+end)/2; if(mid<A[mid]){ end=mid-1; }else if(mid>A[mid]){ start=mid+1; }else{ return true; } } return false; } }
递归版本
【运行时间:78ms 占用内存:11264k】import java.util.*; public class MagicIndex { public boolean findMagicIndex(int[] A, int n) { if(A==null||n==0) return false; return findIndex(A,0,n-1); } public boolean findIndex(int A[],int start,int end){ if(start>end) return false; int mid=(start+end)/2; if(mid==A[mid]){ return true; } if(mid<A[mid]){ return findIndex(A,start,mid-1); }else{ return findIndex(A,mid+1,end); } } }
直接遍历
【运行时间:89ms 占用内存:11652k】import java.util.*; public class MagicIndex { public boolean findMagicIndex(int[] A, int n) { if(A==null||n==0) return false; for(int i=0;i<n;i++){ if(A[i]==i) return true; } return false; } }
相关文章推荐
- 程序员面试金典——机器人走方格
- 机器人走方格II
- 63.Unique Paths II&机器人走方格II
- 程序员面试金典——机器人走方格1
- 程序员面试金典:上楼梯、机器人走方格I
- 程序员面试金典:第K个数、机器人走方格
- 机器人走方格II
- 机器人走方格II
- 程序员面试金典——机器人走方格2
- 51nod-【1118 机器人走方格】
- 51Nod-1122-机器人走方格 V4
- 51nod 1120 机器人走方格V3 卡特兰数+卢卡斯定理
- 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格
- 机器人走方格
- 51 NOD 1119 机器人走方格 V2(组合数学 + 逆元)
- 51nod 1122 机器人走方格 V4 【矩阵快速幂】
- 51 4000 nod1119 机器人走方格 V2(组合数学)
- 51nod 1119 机器人走方格(费马小定理)
- [51NOD1119]机器人走方格 V2(dp,Lucas定理)
- 【51Nod1120】机器人走方格 V3