ACM算法笔记(二)斐波那契数列&数组类型

一、斐波那契数列

        定义

                         

        与爬楼梯问题的区别是:终止条件不同

代码参考爬楼梯问题

二、数组类型

        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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值