一、斐波那契数列
定义
与爬楼梯问题的区别是:终止条件不同
代码参考爬楼梯问题
二、数组类型
1.两数之和
给定一个整数数组nums和一个整数目标值target,请你在该数组中找到目标值target的那两个整数,并返回他们的数组下标
例如: nums=[2,7,11,15],target=9
输出[0,1](2+7=9)
代码(暴力穷举)
public int[] twoSum(int[] nums;int target){
int[] result = new int[2];
for(int i=0;i<nums.length;i++)
for(int j=0;j<nums.length;j++)
if(nums[i]+nums[j]==target)
{
result[0]=i;
result[1]=j;
return result;
}
}
优化代码(引入hash map)
public int[] twoSum(int []nums,int target){
/*key为元素值,value为对应的下标*/
Map<Integer,Integer> storeNums = new HashMap<>(nums.length,1);
for(int i=0;i<nums.length;++i){
int another = target - nums[i];
Integer anotherIndex = storeNums.get(another);
if(num!=anotherIndex){
result[0] = anotherIndex;
result[1] = i;
break;
}
else
{
storeNums.put(nums[i],i);}
}
return result;
}
2.合并两个有序数组
两个非递减排列的数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。
请合并nums2到nums1中,使合并后的数组同样按非递减顺序排列
代码1:先合并后排序
public void merge(int[] nums1,int m,int nums2,int n){
for(int i=0;i<n;++i)
{
nums1[m+1]=nums2[i];
}
Arrays.sort(nums1);//系统排序
}
代码2:利用原有顺序(每次从两个数组的头部去除一个数据进行比较,再放入新数组)
public void merge(int []nums1, int m, int []nums2, int n)
{
int k = m+n;
int []temp = new int k;
for(int index = 0, nums1Index = 0,nums2Index = 0;index<k;index++)
{
if(nums1Idex>=m)
temp[index] = nums2[nums2Index++]; //nums1已取完
else if(nums2Index >= n)
temp[index] = nums1[nums1Index++]; //nums2已取完
else if(nums1[nums1Index] < nums[nums2Index])
temp[index] = nums2[nums2Index++]; //nums1较小
else
temp[index] = nums1[nums1Index++]; //nums2较小
}
for(int i=0;i<k;i++)
nums1[i] = temp[i];
}
代码3:如果数组有多余空间,可以从多余空间开始排列(减少空间复杂度)
3.移动零
对于数组num,将所有0移动到数组末尾,并保持其他非零元素的位置
public void MoveZero(int []nums)
{
if(nums == null)
return;
int j=0;
//将非0的个数,只要是非0的都赋给nums[j]
for(int i=0;i<nums.length;++i)
if(nums[i]!=0)
nums[j++] = nums[i];
//将末尾元素都赋0
for(int i=j;i<nums.length;++i)
nums[i]=0;
}
4.找出数组中消失的数字
一个包含n个整数的数组nums,其中nums[i]在区间[1,n]内。请你找出所有在[1,n]范围内但没有出现在nums中的数组,并以数组的形式返回结果。
nums = [4,3,2,7,8,2,3,1]
[5,6]
由于进阶要求不允许使用额外空间,所以尝试利用自身空间。
遍历数组,将出现的数据对应索引位置的数改为负数。一次遍历完成后未变为负数的索引位置即为确实的数
public List<Integer> findDisappearedNumbers(int[] nums){
int n = nums.length;
for(int num: nums){
int x = n(num - 1)%n; //对n取模来还原其本来的值
nums[x] +=n;
}
List <Integer> reslut = new ArrayList<Integer>();
for(int i=0;i<n;i++)
{
if(nums[i]<=n)
result.add(i + 1);
}
return result;
}