LeetCode(605,581,566)

LeetCode(605,581,566)

摘要:605盲改通过;581开始思路错误,后利用IDE修改(多重循环跳出方法);566用C语言时需要动态内存分配,并且入口参数未能完全理解,转用C++。

605. Can Place Flowers

中文描述:在保证数组中相邻的元素不同时为1时,判断是否能在原数组中添加n个1,返回false/true。

思路:先考虑前两个元素是否为零,再考虑中间的位置是否同时有三个相邻元素为零,最后考虑最后两个元素是否为零。当确定能添加一个“1”时,将原数组的相应位置置1,便于后面的判断。

//C语言描述:2017.6.7     
bool canPlaceFlowers(int* flowerbed, int flowerbedSize, int n) 
{
    if(flowerbed[0]==0&&flowerbed[1]==0)
       {
           n--;
           flowerbed[0]=1;
       }
     for(int i=1;i<flowerbedSize-2;i++)
         if(flowerbed[i-1]==0&&flowerbed[i]==0&&flowerbed[i+1]==0)
           {
               n--;
               flowerbed[i]=1;
           }
    if(flowerbed[flowerbedSize-1]==0&&flowerbed[flowerbedSize-2]==0)
        n--;
      return n < 1;
}

581.Shortest Unsorted Continuous Subarray

中文描述: 判断原始数组中需要排序的区域,返回其需要重新排序的元素数目

思路: 依次确定始末位置,然后做差处理后得到需要重新排序的元素数目。确定起始位置时,从第一个元素开始,依次将其与后面的每个元素进行比较,判断是否满足大小条件,若不满足则可立马判定起始位置,末尾位置判断步骤相同。
注: 在跳出多重循环时,第一种方法中使用了goto语句,编程实践中尽量不要使用,故有了第二种方法,使用break语句加上辅助标志flag,在外层循环中利用flag判断是否需要利用break跳出循环。

//方法一:C语言描述,使用goto语句      
int findUnsortedSubarray(int* nums, int numsSize)  
{
  
    int start=0,final=0,i=0,j=0;

	for(i=0;i<numsSize-1;i++)
		for(j=i+1;j<numsSize;j++)
		{
			if(nums[i]>nums[ j ])
				{
					start =i;
					goto p1;       //goto语句帮助跳出多重循环,但是不建议使用,但是真的很好用
			     };
		}    
    p1:  ;

	for(i=numsSize-1;i>0;i--)
	  for(j=i-1;j>=0;j--)
		{
			if(nums[i]<nums[j])
				{
					final = i;
					goto p2;     //goto语句帮助跳出多重循环,但是不建议使用,但是真的很好用
			     }
		}  
    p2: ;

	if(final==start)
		  return 0;
	else
	      return final-start+1;   
 }

//方法二:C语言描述,使用break语句和辅助标志flag
  int start=0,final=0,i=0,j=0,flag;

	for(i=0,flag=0;i<numsSize-1;i++)
	{
			for(j=i+1;j<numsSize;j++)
		  {
			if(nums[i]>nums[ j ])
				{
					start =i;
					flag = 1;
					break;
			     };
		  }
			if(flag)    break;         // help getout of the big cycle
	}

	for(i=numsSize-1,flag=0;i>0;i--)
	{
	  for(j=i-1;j>=0;j--)
		{
			if(nums[i]<nums[j])
				{
					final = i;
					flag = 1;
					break;
			     }
		}
	  if(flag)  break;
	}

	  if(final==start)
		  return 0;
	  else
	      return final-start+1; 

566. Reshape the Matrix

中文描述:如果维数合适的话,将原二维数组重塑成一维数组,否则返回原数组。类似matlab中的reshape函数。

思路:先判断维数是否正确,不正确原样输出,正确则reshape。reshape时,使用一个循环,先取原数组中的元素,依次将其放入新的数组中。

注:思路很简单,操作起来也很简单。但是使用C语言编写时,输入参数中的后两项int** columnSizes, int* returnSize未能理解,并且要求使用malloc函数,题目读了半天还是没有弄清楚怎么回事。故转用C++写,参考了一下已有的程序。

//C++描述:数组的行列转换。
class Solution {
public:
    vector<vector<int>> matrixReshape(vector<vector<int>>& nums, int r, int c) {
        int m = nums.size(), n = nums[0].size();
        if (m * n != r * c) return nums;
        vector<vector<int>> res(r, vector<int>(c));
        for (int i = 0; i < r * c; ++i) {
            res[i / c][i % c] = nums[i / n][i % n];
        }
        return res;
    }
};
posted @ 2017-06-10 16:25  Pangolin2  阅读(584)  评论(0编辑  收藏  举报