10- I. 斐波那契数列
代码:
class Solution {
public int fib(int n) {
if(n==0){
return 0;
}
if(n==1){
return 1;
}
int[] f=new int[n+1];
f[0]=0;
f[1]=1;
for(int i=2;i<n+1;++i){
f[i]=(f[i-1]+f[i-2])%1000000007;
}
return f[n];
}
}
改进:
class Solution {
public int fib(int n) {
int a=0,b=1,sum=0;
for(int i=1;i<n+1;++i){
sum=(a+b)%1000000007;
a=b;
b=sum;
}
return a;
}
}
03. 数组中重复的数字
代码:
class Solution {
public int findRepeatNumber(int[] nums) {
int []n=new int[nums.length];
int num=0;
for(int i=0;i<nums.length;++i){
n[nums[i]]+=1;
}
for(int i=0;i<nums.length;++i){
if(n[i]>1){
num=i;
break;
}
}
return num;
}
}
改进:
算法思想:
遍历数组 nums,设索引初始值为 i = 0 :
1.若 nums[i] = i : 说明此数字已在对应索引位置,无需交换,因此跳过;
2.若 nums[nums[i]] = nums[i]:代表索引 nums[i] 处和索引i处的元素值都为nums[i] ,即找到一组重复值,返回此值 nums[i] ;
3.否则: 交换索引为i和 nums[i]的元素值,将此数字交换至对应索引位置。
若遍历完毕尚未返回,则返回 -1 。
(作者:jyd 来源:力扣)
class Solution {
public int findRepeatNumber(int[] nums) {
int temp;
int i=0;
while(i<nums.length){
if(nums[i]==i){
++i;
continue;
}else if(nums[nums[i]]==nums[i]){
return nums[i];
}else{
temp=nums[i];
nums[i]=nums[temp];
nums[temp]=temp;
}
}
return -1;
}
}
改进2:
哈希表
class Solution {
public int findRepeatNumber(int[] nums) {
HashSet<Integer> set = new HashSet<>();
for(int num : nums){
if(set.contains(num)){
return num;
}
set.add(num);
}
return -1;
}
}
04. 二维数组中的查找
代码:
算法思想:
首先和右上角的元素比较,若相等,则返回true;若大于该元素,则删除第一行;若小于该元素,则删除最后一列,依次类推,直至比较到左下角元素,若还未找到相同元素,则返回false。
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix==null||matrix.length==0){
return false;
}
int i=0;
int j=matrix[0].length-1;
while(i<matrix.length&&j>-1){
if(matrix[i][j]==target){
return true;
}else if(target>matrix[i][j]){
i++;
}else{
j--;
}
}
return false;
}
}
注意:
1.获取二维数组的行数和列数:
int rows = i.length;//行数
int columns = i[0].length;//列数
2.数组为空时,返回false。