自学算法第1篇(请多多指教)

leetcode第397题-整数替换

目录

leetcode第397题-整数替换

题目:

解决思路:

1.枚举

循环源码:

2.记忆化搜索递归(动态规划)

记忆化搜索源码:

参考:

1.归算法参考:递归算法讲解_LightOn-CSDN博客_递归算法

2.记忆化搜索算法学习: 动态规划--5道题入门 - 知乎


题目:

给定一个正整数 n ,你可以做如下操作:
如果 n 是偶数,则用 n / 2替换 n 。
如果 n 是奇数,则可以用 n + 1或n - 1替换 n 。
n 变为 1 所需的最小替换次数是多少?

解决思路:

1.枚举

从题目自身出发,定义一个函数,传入参数n,进行循环,判断其奇偶数,进行除2或者+1,-1操作,定义计时器便可。

循环源码:

class Solution1{
private:
	int count=0;
public:
	int integerReplacement(int n) {//循环或者递归均可
		int temp;
		while(n>1)//判断是否大于1
		{
			if(n%2==0)//如果整除2,则n=n/2,计数器+1
			{
				temp=n/2;
				count++;
			}
			else//如果不整除2,则令n--;计数器+1
			{
				temp=n-1;
				count++;
			}
			n=temp;

		}
		return count;
	}
};

2.记忆化搜索递归(动态规划)

创建一个记忆数组,在每一次递归时都首先检查存取整数n的记忆数组是否已经存在,若已存在则直接返回,不需要再进行递归下去。此时时间复杂度大大将达。

记忆化搜索源码:

class Solution2 {//类的方法,定义递归函数,该方法类似与动态规划。
private:
    unordered_map<int, int> memory;//定义容器数组

public:
    int integerReplacement(int n) {//定义函数
        if (n == 1) {
            return 0;//如果n==1,返回的计数为0
        }
        if (memory.count(n)) {//如果数组的计数已存在,则直接返回。
            return memory[n];
        }
        if (n % 2 == 0) {//如果整除2,则计数改数组的数组进行递归。
            return memory[n] = 1 + integerReplacement(n / 2);
        }
        return memory[n] = 2 + min(integerReplacement(n / 2), integerReplacement(n / 2 + 1));

    }
};

参考:

1.递归算法参考:递归算法讲解_LightOn-CSDN博客_递归算法

2.记忆化搜索算法学习: 动态规划--5道题入门 - 知乎

计算机学生自学算法并找到相关工作是完全有可能的,但需要有系统性和策略。以下是一些建议: 1. **基础掌握**:首先,确保对数据结构(如数组、链表、树、图等)和基本算法(排序、搜索、递归等)有深入理解,这些都是算法的基础。 2. **学习资源**:利用在线课程(如Coursera、edX、LeetCode、Codecademy)、书籍(如《算法导论》、《算法设计与分析基础》)、编程挑战网站和博客来学习和实践。 3. **实践编程**:通过解决实际问题,比如参与算法竞赛(如ACM/ICPC、LeetCode、HackerRank等),编写代码实现并优化算法。 4. **理解复杂性**:了解时间复杂度和空间复杂度,这对于设计高效算法至关重要。 5. **算法设计思维**:学习分治法、动态规划、贪心法等核心算法设计技巧,培养解决问题的能力。 6. **项目经验**:尝试将所学应用到小项目中,例如搜索引擎、推荐系统等,这有助于提升实际应用能力。 7. **持续学习**:算法领域发展迅速,定期关注新的算法和技术,保持学习的热情和更新知识库。 8. **简历和面试准备**:清楚地在简历中展示你的算法技能,并准备面试时可能遇到的算法题,如解释算法的工作原理、分析其复杂性等。 相关问题: 1. 除了理论学习,实际操作对自学算法的重要性如何? 2. 如何通过实际项目提升算法应用能力? 3. 面试时,如何有效地展示自己的算法水平?
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值