买卖股票的最佳时机I,删除排序数组重复项,有效括号判断问题

买卖股票的最佳时机

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
注意你不能在买入股票前卖出股票。
示例 1:输入: [7,1,5,3,6,4]输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
示例 2:输入: [7,6,4,3,1];输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

遍历一遍数组,每次更新买入最低的价格,然后每次用当前值减去最低买入价格,用来更新最大利润,最后得到的必定是最大利润;

int maxProfit(int* prices, int pricesSize) 
{
    int min_in=0x7FFFFFFF,realmax = 0;
    for(int i = 0;i < pricesSize;i++)
    {
        min_in = min_in<prices[i]?min_in:prices[i];
        realmax = realmax>prices[i]-min_in?realmax:prices[i]-min_in;
    }
    return realmax>0?realmax:0;
}
删除排序数组重复项

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例 1:给定数组 nums = [1,1,2],函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。
示例 2:给定 nums = [0,0,1,1,1,2,2,3,3,4],
函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。你不需要考虑数组中超出新长度后面的元素。

这里因为是有序数组,我们只需要以首元素为基准向后检测,遇到不同的元素便放在首元素的后面,然后一第二个元素为基准向后检测,不同的放在第三个…这样,我们就可以把数组中的所有不同元素都放在前面的位置。

int removeDuplicates(int* nums, int numsSize)
{
    if (!numsSize)
	{
		return 0;
	}
	int i=0;
    for(int j=i+1;j<numsSize;j++)
    {
       if(nums[j]!=nums[i])
      {
         i++;
         nums[i]=nums[j];
      }
    }
return i+1;
}
有效括号判断问题

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:输入: “()”;输出: true
示例 2:输入: “()[]{}”;输出: true
示例 3:输入: “(]”;输出: false
示例 4:输入: “([)]”;输出: false
示例 5:输入: “{[]}”;输出: true

根据题目的要求,我们先求出数组的长度,在合法情况下,所有括号都是成对出现的,所以我们就分派(len/2)+2(这里的加2是为了防止’[’&’]'情况下的越界访问);然后每检测到一个右括号,就像ptr里面存放,并且a+1;一旦遇到对应的左括号(根据结合性,多重括号必定由内到外一一对应)就a-1,当最后遍历完数组时a的值是0,说明所有的括号都在正确的位置且成对出现。

int isValid(char* s) 
{
    int len= 0;
    while(*(s+len)){ len++; }
    char* ptr = (char*)malloc((len/2)+2);
    memset(ptr,0,(len/2)+2);
    int i =0,a = 0;
    for(i =0;i<len;i++)
    {
       if((*(s+i)=='(')||(*(s+i)=='{')||(*(s+i)=='['))
       {
           a++;
           *(ptr+a) = *(s+i);
       }
       else if ((*(s+i)==(*(ptr+a)+1))||(*(s+i)==(*(ptr+a)+2)))
       {
           a--;
       }
        else
        {
            return 0;
        }
    }
    if(a)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值