算法题解题思路及代码(不定时更新)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法题解题思路及代码(不定时更新)相关的知识,希望对你有一定的参考价值。

毕业半年, 平时工作总是关注业务、架构,而却越来越少关注性能, 也再也没有做过任何涉及算法的工作了

希望有时间把这些拉下的东西拾起来,毕竟不论是使用什么语言,从事什么行业,只要是程序员,算法才是真正的基础。

题目来自leetcode,代码语言通常为C/C++,后期可能个别题目会用Golang


万事开头难,但坚持下去其实更难。

(2018.2.3)



题目1:给定和,获取加数

描述: 给定一个整数数组,以及一个整数,已知这个整数是数组内某两个元素的和,现在需要找到,并返回这两个元素的索引,例如:

    整数数组:{11, 7, 12, 2}

    整数       :9

    返回结果:{1, 3}

(假定结果一定存在于给定数组,并且不需要考虑存在多组结果)

题目链接:https://leetcode.com/problems/two-sum/description/


解答:

1、最传统的方法就是挨个查找,判断结果,具体步骤是:

每一趟都从下图第一个元素(11)开始, 固定住第一个元素不变,计算当前元素与其后每个元素的值之和,判断是否等于目标整数

这种方法,最坏的情况下,数组内每一对元素都会被计算一次,因此时间复杂度为O(N * N)

技术分享图片

代码:

vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> ret;
        int sz = nums.size();
        for(size_t i = 0; i < sz - 1; ++i) {
            for(size_t j = i + 1; j < sz; ++j) {
                if(nums[i] + nums[j] == target) {
                    ret.push_back(i);
                    ret.push_back(j);
                    return ret;
                }
            }
        }
        return ret;
    }

2、上面的贪婪法可以将步骤分解为两部分,外层循环和内层循环,每当外层循环执行一步,内层循环都需要逐个遍历剩下的元素,执行一趟时间复杂度为O(N)的过程,在整个过程中,外层循环是无法优化的,而内层的循环作为优化,可以考虑用空间换取时间的思路:即事先对整个数组建立索引,使得每一趟的内层循环不再是遍历,而是精确查找,使得算法的时间复杂度由O(N*N)变为O(N*1)

具体步骤是:

技术分享图片


3、建立索引的过程可以分解到外层循环的每一步当中:

一开始无索引,每一步都在索引中查找目标元素,如果没有,则将当前元素存入索引,并迭代至下一步


比较1、2、3方法,

1方法时间复杂度为O(N*N),最低效,

2、3方法整体时间复杂度都是O(N),区别在于 2方法是在一开始就建立了完整的索引,而3方法则是在迭代的过程中逐步建立索引

在悲观的情况下,2、3方法效率是相同的

在乐观的情况下,3方法只需要向索引中存放一个元素,因此相对来说更高效

以上是关于算法题解题思路及代码(不定时更新)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode解题思路及最佳代码 -- Python3实现 -- 更新中

中科大2008年复试机试题

第28题手写抽奖算法

LeetCode刷题笔记-数据结构-day2

编程题及解题思路(2,原串翻转问题)

2022华为杯研究生数学建模解题思路和代码思路