二.存在重复元素
代码:
bool containsDuplicate(int* nums, int numsSize) {
if (numsSize <= 0)
{
return 0;
}
for (int i = 0; i < numsSize - 1; i++)
{
for (int j = i + 1; j < numsSize; j++)
{
if (nums[i] == nums[j])
{
return true;
}
}
}
return false;
}
解题思路:
1.首先要排除输入的个数是非正数的错误情况
2.考虑正数:
(1)判断有没有重复,需要从第0个数开始与后面的数依次比较,第1个数与后面的数依次比较······以此类推,可得需用嵌套循环
(2)申请i, j两个空间,i为0,j永远比i大一,开始比较下标所对应元素,判断是否相等
(3)只要出现相等情况,返回true;若始终没有出现,则最终返回false
三.买股票的最佳时机II
代码:
int maxProfit(int* prices, int pricesSize) {
if (pricesSize <= 1)
{
return 0;
}
int res = 0, i;
for (i = 1; i < pricesSize; i++)
{
if (prices[i] > prices[i - 1])
{
res += prices[i] - prices[i - 1];
}
}
return res;
}
解题思路:
1.首先要排除输入的个数小于两个的错误情况(股票的买入与卖出至少需要两天)
2.因为要在不能同时参与多笔交易的条件下,尽可能地完成更多的交易
(1)申请 i 一个空间,赋值为1,进入循环,让数组中的元素与前面的一个元素比较,只要大于前面元素,使其相减,所得数就作为这笔交易的利润。依次加上所有交易的利润,利润和即为所能获取的最大利润。
(2)若该元素不大于前面的那个元素,则利润和无变化(股票的此次交易没有完成),i 自增,使该元素的下一元素再与该元素比大小
四.旋转数组
代码一:
void rotate(int* nums, int numsSize, int k) {
while (k > 0)
{
int i = nums[numsSize - 1];
for (int j = numsSize - 2; j >= 0; j–)
{
nums[j + 1] = nums[j];
}
nums[0] = i;
k–;
}
return ;
}
解题思路:
1.每向右旋转一次:数组最后一个元素都会提到第一个,其余元素均会往后移一位,循环次数会少一次
2.设置两个循环(嵌套),外循环控制旋转次数(转一次少一次,k 自减),同时把每一次旋转后的最后一个元素赋值给第一个;小循环,负责把其余元素均赋给下一位。
代码二:
void rotate(int* nums, int numsSize, int k)
{
int result[numsSize], p = 0;
for (int i = 0; i < numsSize; i++)
{
result[i] = nums[i];
}
for (int j = 0; j < numsSize; j++)
{
p = (j + k) % numsSize;
nums[p] = result[j];
}
解题思路:
3元素在数组中的2位置上,(2+3) % 7 = 5
5元素在数组中的4位置上,(4+3) % 7 = 0
6元素在数组中的5位置上,(5+3) % 7 = 1
7元素在数组中的6位置上,(6+3) % 7 = 2
上述可得:(元素位置+偏移或旋转步数) % 元素个数 = 旋转后的位置
1.重新申请一个和nums一样空间的数组,将nums赋值给新数组
2.利用上述结论,把新数组中的元素依次放入nums的新对应位置