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

news/2024/7/3 17:43:11

一、斐波那契数列

        定义

                         

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

代码参考爬楼梯问题

二、数组类型

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

http://www.niftyadmin.cn/n/4217505.html

相关文章

ACM算法笔记(三)链表算法

一、合并两个有序链表 将两个升序链表合并为一个升序链表后返回&#xff0c;新链表是通过拼接两个链表的节点组成的 思路&#xff1a;分别比较两个链表头部的节点&#xff0c;将较小节点的连接到新链表后 public ListNode mergeTwoList(ListNode l1,ListNode l2) {if(l1 null…

Vue学习Day1 vue安装、vue体验程序、vue中的MVVM、vue的生命周期、vue的一些简单指令

想利用暑假时间好好学习一下vue&#xff0c;会记录每一天的学习内容。 今天是学习vue的第1天&#xff01; 起起伏伏乃人生常态&#xff0c;继续加油&#xff5e; 学习内容1. Vue.js 安装方式一&#xff1a;直接CDN引入方式二&#xff1a;下载和引入方式三&#xff1a;NPM安装2.…

Linux 小问题&小技巧

001&#xff1a;建立管理员组内一般用户(CentOS)&#xff1a;  在一般情况下&#xff0c;一般用户通过执行 "su - " 命令&#xff0c;再输入正确root密码就可登录root桌面&#xff0c;现建功立业一个管理员的组&#xff0c;只允许这个组的用户执行 " su - &qu…

ACM算法笔记(四)栈、队列、二叉树的遍历

一、用栈实现队列 用两个栈实现队列&#xff08;先进先出&#xff09;&#xff0c;队列应当支持(push、pop、peek、empty) 思路&#xff1a;双栈一个负责输入一个负责输出&#xff08;压入操作正常&#xff0c;弹出时将输入栈的元素依次弹出然后压入输出栈&#xff09; privat…

java开发为什么需要UML

出处 www.cnejb.com 知道UML造成了怎样的局面大混乱吗&#xff1f;知道什么样的功能是UML拥有但JAVA不具备的吗&#xff1f;知道我们为什么需要除JAVA外的另一种电脑语言吗&#xff1f;UML并不仅仅只是JAVA或者其它什么语言的替代品。UML并不仅仅只是JAVA或者其它什么语言的替代…

ACM算法笔记(五)二叉树的检查和变换

一、对称二叉树 给定一颗二叉树&#xff0c;检查他是否对称 思路&#xff1a;使用递归处理&#xff08;递归的比较左子树的左孩子和右子树的右孩子&#xff09; public bool isSymmetric(TreeNHode root) {if(root nuill)return ture;return deepCheck(root.left,root.right)…

对Vue的生命周期的理解

因为是第一天学习vue&#xff0c;可能有理解不全面或者错误的地方&#xff0c;如果有误导&#xff0c;非常抱歉。 Vue的生命周期1. 生命周期是什么2. 生命周期过程图3. Vue的生命周期钩子函数4. 测试钩子函数1. 生命周期是什么 Vue的每个组件都是独立的&#xff0c;从一个组件…