• 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;
        }
    };
    
  • 相关阅读:
    "gcc: cannot specify -o when generating multiple output files"解决方案
    VSCode 回退到上一层
    Mac下的clion配置c/c++环境
    安装homebrew报错error: Not a valid ref: refs/remotes/origin/master 的解决方法
    正则多个空格替换成一个空格 多个相同的字符值保留一个
    python for 循环的速度
    下载器
    requests content 和text 编码格式
    博客园积分排名
    python QQ 发送邮件功能
  • 原文地址:https://www.cnblogs.com/HZL2017/p/6979115.html
Copyright © 2020-2023  润新知