leetcode 周赛(hard),使所有区间的异或结果为零(js实现)

给你一个整数数组 nums​​​ 和一个整数 k​​​​​ 。区间 [left, right](left <= right)的 异或结果 是对下标位于 left 和 right(包括 left 和 right )之间所有元素进行 XOR 运算的结果:nums[left] XOR nums[left+1] XOR ... XOR nums[right] 。

返回数组中 要更改的最小元素数 ,以使所有长度为 k 的区间异或结果等于零。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/make-the-xor-of-all-segments-equal-to-zero

这个当然大佬们都用各种骚操作解决,不过本人换了种思路使用递归枚举,发现也能在时间允许范围内得到解决,不过用的递归,内存上过不了,代码也有很多需要优化的地方(大佬请绕过),仅供思路。

 var minChanges=function(nums,k){
      var len = nums.length;
      var tmp_enums=enums = Math.ceil(len / k);
      //var left = len % k;
      var fileds=[];
      var pool = [];
      function get_real_seq(col,row){
        return row*k+col;
      }

      for(let i =0;i < k ;i++){
        fileds[i]=new Array();
      }
      for(let j=0;j -1)){
            break;
          }
          if(!(fileds[j][cur_val]>-1)){
            fileds[j][cur_val] = 1;
          }else{
            fileds[j][cur_val]++;
          }
          cursor+=k;
        }
        tmp_enums = enums;
      }
      //console.log(fileds);
      var xor = 0;
      var tt = 0;
      function recur(tmp_enums,cursor,col,xor,times,c){
        if(col > k-1){
          pool.push([xor,times,c]);
          tt++;
          return;
        }
        let cursr = cursor;
        let te = tmp_enums;
        while(te--){
          cur_val = nums[cursr];
          if(!(cur_val > -1)){
            break;
          }
          let x = xor ^ cur_val;
          let fs = fileds[col][cur_val];
          let t = times+fs;
          /* if(col == k-1){
            pool.push([x,t]);
            tt++;
          } */
          recur(enums,cursor+1,col+1,x,t,fs

 

你可能感兴趣的:(算法学习笔记,算法,js,leetcode)