前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Leetcode -455.分发饼干 -459.重复的字符串】

【Leetcode -455.分发饼干 -459.重复的字符串】

作者头像
YoungMLet
发布2024-03-01 09:50:13
730
发布2024-03-01 09:50:13
举报
文章被收录于专栏:C++/Linux

Leetcode -455.分发饼干

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。

示例 1 : 输入: g = [1, 2, 3], s = [1, 1] 输出 : 1 解释 : 你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1, 2, 3。 虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。 所以你应该输出1。

示例 2 : 输入: g = [1, 2], s = [1, 2, 3] 输出 : 2 解释 : 你有两个孩子和三块小饼干,2个孩子的胃口值分别是1, 2。 你拥有的饼干数量和尺寸都足以让所有孩子满足。 所以你应该输出2.

思路是先将两个数组从小到大排序,用两个指针 i 和 j 分别遍历两个数组;当s[j] 饼干的尺寸大于等于当前g[i]孩子的胃口时,i和j都往后走;否则,s[j] 小于g[i]时,j往后走,直到找到适合当前孩子的饼干尺寸;最终返回i;

代码语言:javascript
复制
		int compare(void* p1, void* p2)
		{
		    return *(int*)p1 - *(int*)p2;
		}
		
		int findContentChildren(int* g, int gSize, int* s, int sSize)
		{
		    //给两个数组排序
		    qsort(g, gSize, sizeof(g[0]), compare);
		    qsort(s, sSize, sizeof(s[0]), compare);
		
		    //i和j分别遍历孩子的胃口值和我有的饼干数量尺寸
		    int i = 0, j = 0;
		
		    //i和j都要小于数组长度
		    while (i < gSize && j < sSize)
		    {
		        //当我的饼干尺寸小于孩子的胃口值,饼干的尺寸往后遍历,直到找到合适这个孩子的胃口的饼干
		        //当我的饼干尺寸大于等于孩子的胃口值,i和j都往后遍历,判断下个孩子的胃口值
		        //i统计的是当前胃口已经满的孩子,所以最终返回i即可
		        if (s[j] >= g[i])
		        {
		            i++;
		        }
		        j++;
		    }
		    return i;
		}

Leetcode - 459.重复的字符串

题目:给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

示例 1: 输入: s = “abab” 输出 : true 解释 : 可由子串 “ab” 重复两次构成。

示例 2 : 输入 : s = “aba” 输出 : false

示例 3 : 输入 : s = “abcabcabcabc” 输出 : true 解释 : 可由子串 “abc” 重复四次构成。(或子串 “abcabc” 重复两次构成。)

思路是用两个指针 i 和 j ,i遍历一次,j会逐一判断i之前的元素是否相同,若不相同,则不是重复字符串,flag置0;若相同,则继续遍历,直到j遍历完;这一过程 i 就是在寻找开始重复字符串的开头,这样子 j 遍历 i 之前的元素就会每一个都相同,若不相同,则说明从 i 这个位置开始不能构成 s 的字串;

例如图,i 从下标为1开始,将 i 赋给 j ,判断 i 之前的元素是否可以构成 s 的字串,很明显从下标1开始不能构成;

i 从下标2开始,根据思路,i 之前的元素是可以构成 s 的字串的;

代码语言:javascript
复制
		bool repeatedSubstringPattern(char* s)
		{
		    //i找到开始重复字符串的开头,j开始遍历,逐一判断i之前的元素是否相同,
		    //若不相同,则不是重复字符串,flag置0;若相同,则继续遍历,直到j遍历完,flag还没有置0,就返回true
		    for (int i = 1; i <= strlen(s) / 2; i++)
		    {
		        //长度为奇数不可能有重复的字符串
		        if (strlen(s) % i == 0)
		        {
		            //flag默认为1
		            int flag = 1;
		
		            for (int j = i; j < strlen(s); j++)
		            {
		                if (s[j] != s[j - i])
		                {
		                    flag = 0;
		                    break;
		                }
		            }
		            if (flag)
		            {
		                return true;
		            }
		        }
		    }
		    return false;
		}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Leetcode -455.分发饼干
  • Leetcode - 459.重复的字符串
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档