本次加入datawhale组织的八月份组队学习,选择了力扣刷题的小组,刷点题目,让自己的脑子不那么僵化
力扣链接https://leetcode-cn.com/
题目描述:实现 pow(x, n) ,即计算 x 的 n 次幂函数。
还未开始看题,看到题目的时候,心里想着或许是刚开始学习,先拿点简单的练手,当看到困难评级为中等的时候,突然意识到事情不对。
尝试解题
double myPow(double x, int n)
{
if (n == 0)
return 1;
if (n > 0)
{
if (n % 2 == 1)
return x * myPow(x*x, n / 2);
else return myPow(x*x, n / 2);
}
else
{
if(n%2==1|| n % 2 == -1)
return 1/x* myPow(x*x, n / 2);
else return myPow(x*x, n / 2);
}
}
x=2,n= 5:
2^5 = 4^2.5 = 4^2*2
x=2,n=-5:
2^-5=4^-2.5=4^-2*(1/2)
该题目为求最大子序列和,相对而言比起求和的同时记录起点和终点的题目稍微简化。
int maxSubArray(int* nums, int numsSize)
{
int max=nums[0];
int nowsum=0;
for(int i=0;i<numsSize;i++)
{
nowsum+=nums[i];
if(nowsum>max)
max=nowsum;
if(nowsum<0)
nowsum=0;
}
return max;
}
例如:
[1,3,-5,3]
上方序列
当循环进行到第二个元素时,max=4,nowsum=4
而加入-5后nowsum=-1,max=4
此时对于以第0个元素开头的序列其实已经没有必要再加下去了,因为它对之后的元素产生的是负影响
因此直接将nowsum设置为0,此时从相当于从下一个元素进行累计
若其之后的元素之和能够大于max自然就更新,否则max也已经记录了1+3=4这个当前最大的子序列和
int majorityElement(int* nums, int numsSize)
{
int flag=nums[0];
int count=0;
for(int i=0;i<numsSize;i++)
{
if(count==0)
{
flag=nums[i];
count++;
}
else
{
flag==nums[i]?count++:count--;
}
}
return flag;
}
int rob(int* nums, int numsSize)
{
if(numsSize==0)
return 0;
if(numsSize==1)
return nums[0];
int a=nums[0];
int b=nums[0]>=nums[1]?nums[0]:nums[1];
for(int i=2;i<numsSize;i++)
{
int temp=b;
b=(a+nums[i])>b?(a+nums[i]):b;
a=temp;
}
return b;
}
char * longestPalindrome(char * s)
{
int len = strlen(s);
if (!len)
return "";
int maxlen = 1;
int low = 0;
int high = 0;
for (int i = 0; s[i] != 0; i++)
{
if (s[i] == s[i + 1])//偶数情况判断
{
int nowlow, nowhigh;
int nowmax;
for (int n = 0; n <=len / 2; n++)
{
if (i - n >= 0 && i + 1 + n < len)
{
if (s[i - n] == s[i + 1 + n])
{
nowlow = i - n;
nowhigh = i + n + 1;
nowmax = nowhigh - nowlow+1;
}
else
break;
if (nowmax > maxlen)
{
low = nowlow;
high = nowhigh;
maxlen = nowmax;
}
}
else break;
}
}
if ((i >= 1) && (s[i - 1] == s[i + 1]))//奇数情况判断
{
int nowlow, nowhigh;
int nowmax;
for (int n = 1; n <=len / 2; n++)
{
if (i - n >= 0 && i + n < len)
{
if (s[i - n] == s[i + n])
{
nowlow = i - n;
nowhigh = i + n ;
nowmax = nowhigh - nowlow+1;
}
else
break;
if (nowmax > maxlen)
{
low = nowlow;
high = nowhigh;
maxlen = nowmax;
}
}
else break;
}
}
}
s[high + 1] = '\0';
s = s + low;
return s;
}
1、将回文子串分为两种类别:子串长度为奇数、子串长度为偶数
2、奇数:从子串中心向两边扩展,加上或减去同样的值时,元素应当相等
3、偶数:由于数量原因,无法直接得到子串中心的下标元素,只能通过判断子串中心为两个相同的元素,
从而向两边扩展。
int findLengthOfLCIS(int* nums, int numsSize)
{
if(numsSize<2)
return numsSize;
int max=0;
int nowmax=1;
for(int i=0;i<numsSize-1;i++)
{
if(nums[i+1]>nums[i])
nowmax+=1;
else nowmax=1;
if(nowmax>max)
max=nowmax;
}
return max;
}