将一个大问题切割成一个一个小问题,用到了递归,自己调用自己
在返回的过程中,把小问题解决并通过递归返回合并成大问题的解
力扣169
class Solution { public int majorityElement(int[] nums) { //调用递归函数,递归在返回的时候用到了分治法的思想 return getMajority(nums,0,nums.length-1); } //定义递归函数,数组,左右指针 public int getMajority(int[] nums,int left,int right){ //递归的停止条件,当分割到最后的时候,左右指针重合,只剩下一个值,返回这个值 if(left==right){ return nums[left]; } //设一个中间值,这个值在左右指针中间 int mid=left+(right-left)/2; //递归,分隔左边的递归,找到这一层最多的元素 int l=getMajority(nums,left,mid); //递归,分隔左边的递归,找到这一层最多的元素 int r=getMajority(nums,mid+1,right); //返回操作 //如果左边最多的元素和右边最多的元素一样,说明合起来之后也是最多的元素 if(l==r){ return l; } //左右最多元素不一样的情况下,遍历元素,看看哪个更多一点 int lc=0; int rc=0; for(int i=left;i<=right;i++){ if(nums[i]==l){ lc++; } else if(nums[i]==r){ rc++; } } return lc>rc?l:r; } }
力扣53
![]()