leedcode_贪心算法系列
思路:
行首的权值最大,故首先将其置1;
每列由于权值相同,故只需要将0多于1的情况反转即可
思路:
1.计算每个字母的最右边界下标,并记录到新数组中
2.通过遍历原数组,当下标与当前的最右边界相等时,即表示当前字母可以覆盖前面所有字母的最右边界;
划分出新区间,同时当前的下标更新为新区间的左边界
思路:
每当后面的数比前一个数大,就将其差价加到利润中
思路:
确定对应的情侣数(0对1,2对3,,,),查找并将其替换
思路:
判断是否为5,10,20;是则按数量找零,零钱不够时返回false
bool lemonadeChange(int* bills, int billsSize) {
int i,j,k;
int use[+] = {,,,,};
for (i = ; i < billsSize ; i ++)
{
switch(bills[i])
{
case :
use[]++;break;
case :
use[]++;
if (use[]>)
use[]--;
else
return false;
break;
case :
use[]++;
if (use[]>)
{
if (use[]>)
{
use[]--,use[]--;
}
else if (use[]>)
{
use[] -= ;
}
else
return false;
}
else
return false;
break;
default:return false;
}
}
return true;
}
思路:
先对饼干大小及小孩胃口做降序排列,然后将两者做比较,使用饼干尽可能满足多的小孩
int findContentChildren(int* g, int gSize, int* s, int sSize) {
int i,j,k,res = ;
//对孩子胃口及饼干大小做降序排列
for (i = ; i < gSize ; i ++)
{
k = i;
for (j=i+; j < gSize ; j ++)
{
if (g[j] > g[k])
k = j;
}
if (i != k)
{
g[i] = g[i] ^ g[k];
g[k] = g[i] ^ g[k];
g[i] = g[i] ^ g[k];
}
}
for (i = ; i < sSize ; i ++)
{
k = i;
for (j=i+; j < sSize ; j ++)
{
if (s[j] > s[k])
k = j;
}
if (i != k)
{
s[i] = s[i] ^ s[k];
s[k] = s[i] ^ s[k];
s[i] = s[i] ^ s[k];
}
}
//饼干尽可能得满足小孩
for (i=j=; i<gSize && j<sSize ; )
{
if (s[j]>=g[i])
{
i++,j++;
res ++;
}
else
i++;
}
return res;
}
思路:
题意要求不同的任务(字母)间必须有n长度的冷却时间,
1.当n=0时:最短时间即为任务的总长度
2.当n>0时
我们先找出数量最多的任务,即可确定大致的最短时间(n+1)*(max-1)
然后查找是否还有任务的个数是与max相同,个数初始i=1
最后得到总长度:(n+1)*(max-1)+i
#define MAX(X,Y) X>Y?X:Y
int leastInterval(char* tasks, int tasksSize, int n) {
int i,j,k;
int arr[];
memset(arr,,sizeof(arr)); //计算各任务的个数
for (i = ; i < tasksSize ; i ++)
arr[tasks[i]-'A'] ++; //降序处理
for (i = ; i < ; i ++)
{
k = i;
for (j = i+ ; j < ; j ++)
if (arr[j] > arr[k])
k = j;
if (k!=i)
{
arr[i] = arr[i] ^ arr[k];
arr[k] = arr[i] ^ arr[k];
arr[i] = arr[i] ^ arr[k];
}
} //计算最短时间
for (i=; i< ; i ++)
if (arr[i] != arr[])
break; return MAX((arr[]-)*(n+)+i,tasksSize);
}
思路:
先处理数据得到一组加油耗油后的数据
1.若处理后的数据总和为负数,车必然不能运行,返回-1
2.分别以非负数为起点,遍历一圈看其能否回到原点
int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize) {
int i,j,k,res = -;
int use[gasSize];
memset(use,,sizeof(use));
k = ;
//处理得到加油耗油后的数据
for (i = ; i < gasSize ; i ++)
{
use[i] = gas[i]-cost[i];
k += use[i];
}
//剩余油量不能为负数
if (k>=)
{
for (i = ; i < gasSize ; i ++)
{
//以非负数为起点
if (use[i]>=)
{
k = use[i];
//遍历一圈看其能否回到原点
for (j=(i+)%gasSize ; j!=i && k> ; j=(j+)%gasSize)
k += use[j];
if (k>= && j==i)
return i;
}
}
}
return res;
}
优化代码:
int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize) {
int i,totol,sum,start;
totol = sum = start = ;
for (i = ; i < gasSize ; i ++)
{
totol += gas[i]-cost[i];
sum += gas[i]-cost[i];
if (sum<)
{
sum = ;
start = i+;
}
}
return totol<?-:start;
}
leedcode_贪心算法系列的更多相关文章
- 贪心算法(Greedy Algorithm)
参考: 五大常用算法之三:贪心算法 算法系列:贪心算法 贪心算法详解 从零开始学贪心算法 一.基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以 ...
- 简答一波 HashMap 常见八股面试题 —— 算法系列(2)
请点赞,你的点赞对我意义重大,满足下我的虚荣心. Hi,我是小彭.本文已收录到 GitHub · Android-NoteBook 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注 ...
- 算法导论----贪心算法,删除k个数,使剩下的数字最小
先贴问题: 1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b: 一.我的想法:先看例子:a=5476579228:去掉4位,则位数n=10,k=4, ...
- LEETCODE —— Best Time to Buy and Sell Stock II [贪心算法]
Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price of a ...
- ACM_ICPC hdu-2111(简单贪心算法)
一道非常简单的贪心算法,但是要注意输入的价值是单位体积的价值,并不是这个物品的总价值!#include <iostream> #include <stdio.h> #inclu ...
- 基于贪心算法的几类区间覆盖问题 nyoj 12喷水装置(二) nyoj 14会场安排问题
1)区间完全覆盖问题 问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖 样例: 区间长度8,可选的覆盖线段[2,6],[1, ...
- 增强学习贪心算法与Softmax算法
(一) 这个算法是基于一个概率来对探索和利用进行折中:每次尝试时,以概率进行探索,即以均匀概率随机选取一个摇臂,以的概率进行利用,即以这个概率选择当前平均奖赏最高的摇臂(如有多个,则随机选取). 其中 ...
- JAVA算法系列 冒泡排序
java算法系列之排序 手写冒泡 冒泡算是最基础的一个排序算法,简单的可以理解为,每一趟都拿i与i+1进行比较,两个for循环,时间复杂度为 O(n^2),同时本例与选择排序进行了比较,选择排序又叫直 ...
- JAVA算法系列 快速排序
java算法系列之排序 手写快排 首先说一下什么是快排,比冒泡效率要高,快排的基本思路是首先找到一个基准元素,比如数组中最左边的那个位置,作为基准元素key,之后在最左边和最右边设立两个哨兵,i 和 ...
随机推荐
- jquerymobile动态添的无索刷新
当我们使用Ajax或者javascript动态在页面上添加元素后,如添加select控件的option元素,添加ul的li元素.添加之后我们会发现,它们显示的样式不是jQuery Mobile的炫酷样 ...
- P2216 [HAOI2007]理想的正方形(dp+单调队列优化)
题目链接:传送门 题目: 题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表 ...
- (22)Ajax的基本使用(实现登录功能和局部刷新以及防止跨站请求伪造攻击)
Ajax的作用 前后端分离的项目,需要交互,就要通过Ajax来完成交互 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即 ...
- 《DSP using MATLAB》Problem 5.22
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% O ...
- sourcetree删除github远程仓库文件
sourcetree删除远程仓库的master分支文件步骤 第一步:删除本地远程仓库分支的所需要文件或者文件夹(本地和远程仓库同步) 第二步:回到sourcetree提交,推送 第三步:刷新远程仓库
- LeetCode - Two Sum IV - Input is a BST
Given a Binary Search Tree and a target number, return true if there exist two elements in the BST s ...
- 【JVM】jvm虚拟机参数解析
转载:https://blog.csdn.net/see__you__again/article/details/51998038不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正 ...
- 发布自己的npm包
如何发布自己写的npm包,这里有详细解释 : https://blog.csdn.net/u010130282/article/details/82629924 本文旨在解释遇到的问题: 1:需要设置 ...
- linux环境下配置mysql双主复制
简单来说,双主复制就是让两台mysql服务器中的数据保持同步,可以用来实现灾备和负载均衡 主机1 IP:192.168.200.128 主机2 IP:192.168.200.131 两台主机系统均为c ...
- Map的嵌套使用
Map嵌套Map: 例: AAA: Javas班: 001 熊大 002 熊二 Hdoop班 001 小猪猪 002 小菲菲 ★使用增强for循环遍历Set数组: import java.util.H ...