给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。(来源力扣)
示例 1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
class Solution:def longestConsecutive(self, nums: List[int]) -> int:nums = set(nums)res = 0#记录每一次遍历的连续值,用于比较最大for num in nums:# 判断是否是第一个数字,如果不是则不执行,减少复杂度if num - 1 not in nums:tmp = 1while num + 1 in nums:num += 1tmp += 1res = max(res, tmp)return res
贪心算法
事例一:找零钱问题
假设你开了间小店,不能电子支付,钱柜里的货币只有 25 分、10 分、5 分和 1 分四种硬币,如果你是售货员且要找给客户 41 分钱的硬币,如何安排才能找给客人的钱既正确且硬币的个数又最少?
只追求局部最优
1.找给顾客sum_money=41分钱,可选择的是25 分、10 分、5 分和 1 分四种硬币。能找25分的,不找10分的原则,初次先找给顾客25分;
2.还差顾客sum_money=41-25=16。然后从25 分、10 分、5 分和 1 分四种硬币选取局部最优的给顾客,也就是选10分的,此时sum_money=16-10=6。重复迭代过程,还需要sum_money=6-5=1,sum_money=1-1=0。至此,顾客收到零钱,交易结束;
3.此时41分,分成了1个25,1个10,1个5,1个1,共四枚硬币。
#include<iostream>
using namespace std;#define ONEFEN 1
#define FIVEFEN 5
#define TENFEN 10
#define TWENTYFINEFEN 25int main()
{int sum_money=41;int num_25=0,num_10=0,num_5=0,num_1=0;//不断尝试每一种硬币while(money>=TWENTYFINEFEN) { num_25++; sum_money -=TWENTYFINEFEN; }while(money>=TENFEN) { num_10++; sum_money -=TENFEN; }while(money>=FIVEFEN) { num_5++; sum_money -=FIVEFEN; }while(money>=ONEFEN) { num_1++; sum_money -=ONEFEN; }//输出结果cout<< "25分硬币数:"<<num_25<<endl;cout<< "10分硬币数:"<<num_10<<endl;cout<< "5分硬币数:"<<num_5<<endl;cout<< "1分硬币数:"<<num_1<<endl;return 0;
}